locked
Подскажите как правильно передать BitmapImage как параметр команды RRS feed

  • Вопрос

  • Есть вот такой шаблон.

    <DataTemplate>
                            <Border>
                                <!--Image-->
                                <Image x:Name="image"
                                       Stretch="{Binding DataContext.ImageStretch, ElementName=phoneApplicationPage}">
                                	<!-- Image Triggers-->
                                    <i:Interaction.Triggers>
                                		<i:EventTrigger EventName="ImageOpened">
                                            <Command:EventToCommand Command="{Binding DataContext.OpenImageCommand, ElementName=phoneApplicationPage}" CommandParameter="{Binding Source, ElementName=image}"/>
                                        </i:EventTrigger>
                                	</i:Interaction.Triggers>
                                    <Image.Source>
                                        <!--BitmapImage -->
                                        <BitmapImage x:Name="bitmap" UriSource= "{Binding}" CreateOptions="None">
                                            <!--BitmapImage Triggers-->
                                            <i:Interaction.Triggers>
                                                <i:EventTrigger EventName="DownloadProgress">
                                                    <Command:EventToCommand Command="{Binding DataContext.DownloadProgressCommand, ElementName=phoneApplicationPage}" PassEventArgsToCommand="True"/>
                                                </i:EventTrigger>
                                            </i:Interaction.Triggers>
                                        </BitmapImage>
                                        <!--End BitmapImage-->
                                    </Image.Source>	
                                </Image>
                            </Border>
                        </DataTemplate>

    В триггере для Image на событие "ImageOpened", а вернее в обработчик команды, приходит null. А если сделать триггер на BitmapImage то приложение падает по исключению StackOverflow. Как правильно передать BitmapImage?

    Зачем я его передаю? Я хочу вычислить коэффициент, который показывает ориентацию картинки и на основании его присваивать свойство Stretch. Выглядит это так:

    //obj - переданный BitmapImage

    var koef = (double)obj.PixelHeight / obj.PixelWidth; if (koef > 1) { ImageStretch = Stretch.UniformToFill; } else { ImageStretch = Stretch.Uniform; }


    может я закопался и это можно сделать как-то проще?


    7 февраля 2014 г. 11:05

Ответы

  • DataTemplate>
                            <Border>
                                <!--Image-->
                                <Image x:Name="image"
                                       >
                                    <!-- Image Triggers-->
                                    <i:Interaction.Triggers>
                                        <i:EventTrigger EventName="ImageOpened">
                                            <i:InvokeCommandAction Command="{Binding OpenImageCommand, Source={StaticResource VM}}" CommandParameter="{Binding ElementName=bitmap}"/>
                                        </i:EventTrigger>
                                    </i:Interaction.Triggers>
                                    <Image.Source>

    То есть просто заменить биндинг на:

    CommandParameter="{Binding ElementName=bitmap}


    UPD: на то, что я изменил EventCommand на i:InvokeCommandAction  не обращайте, пожалуйста, внимания, т.к. семпл собрал за 2 минуты из подручных средств.



    • Изменено Oleg Kurzov 7 февраля 2014 г. 14:35 сделал лучше.
    • Помечено в качестве ответа V.A.Zolotov 8 февраля 2014 г. 10:54
    7 февраля 2014 г. 14:06

Все ответы

  • DataTemplate>
                            <Border>
                                <!--Image-->
                                <Image x:Name="image"
                                       >
                                    <!-- Image Triggers-->
                                    <i:Interaction.Triggers>
                                        <i:EventTrigger EventName="ImageOpened">
                                            <i:InvokeCommandAction Command="{Binding OpenImageCommand, Source={StaticResource VM}}" CommandParameter="{Binding ElementName=bitmap}"/>
                                        </i:EventTrigger>
                                    </i:Interaction.Triggers>
                                    <Image.Source>

    То есть просто заменить биндинг на:

    CommandParameter="{Binding ElementName=bitmap}


    UPD: на то, что я изменил EventCommand на i:InvokeCommandAction  не обращайте, пожалуйста, внимания, т.к. семпл собрал за 2 минуты из подручных средств.



    • Изменено Oleg Kurzov 7 февраля 2014 г. 14:35 сделал лучше.
    • Помечено в качестве ответа V.A.Zolotov 8 февраля 2014 г. 10:54
    7 февраля 2014 г. 14:06
  • Не хочется пробрасовать UI контрол в ViewModel. Или по другому никак?
    7 февраля 2014 г. 14:30
  • Я протупил.

    поменяйте в моем ответе image на bitmap и в VM приедет именно BitmapImage.

    ЗЫ: поправил код предыдущего ответа.
    • Изменено Oleg Kurzov 7 февраля 2014 г. 14:35
    7 февраля 2014 г. 14:34
  • Спасибо!
    8 февраля 2014 г. 10:54