2016-10-24 9 views
0

У меня есть набор Image s в GridView, и изображения не могут быть загружены мгновенно при открытии страницы. Таким образом, чтобы создать более плавный переход, я пытаюсь использовать EventTrigger в Image анимировать непрозрачность от 0 до 1, когда изображение загружается, например так:EventTriggers на изображении

<GridView.ItemTemplate> 
    <DataTemplate> 
     <Border Background="{ThemeResource ButtonBackground}" HorizontalAlignment="Stretch" MaxWidth="300" MinWidth="200"> 
      <Image Source="{Binding SmallUri}" Stretch="UniformToFill" 
       Opacity="0" ToolTipService.ToolTip="{Binding Author.Name}"> 
       <Image.Triggers> 
        <EventTrigger RoutedEvent="Image.ImageOpened"> 
          <BeginStoryboard> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetProperty="Opacity" To="1" Duration="00:00:00.25" /> 
           </Storyboard> 
          </BeginStoryboard> 
        </EventTrigger> 
       </Image.Triggers> 
      </Image> 
     </Border> 
    </DataTemplate> 
</GridView.ItemTemplate> 

Но всякий раз, когда страница пытается загрузить, его с ошибкой:

Failed to assign to property 'Windows.UI.Xaml.EventTrigger.RoutedEvent' 

Почему это не работает? Он также терпит неудачу, если я изменю свойство RoutedEvent на Loaded, FrameworkElement.Loaded, Image.Loaded или любое другое значение, о котором я мог думать. Я хотел бы получить решение, которое не связано с необходимостью создания пользовательского элемента управления/кода.

ответ

2

But whenever the page attempts to load, it crashes with the error "Failed to assign to property 'Windows.UI.Xaml.EventTrigger.RoutedEvent'." Why does this not work?

Как @Clemens сказал, проблема заключается в Windows, время выполнения XAML, поведение по умолчанию для триггеров событий и единственное событие, которое может использоваться для вызова EventTrigger является FrameworkElement.Loaded.

Я пишу этот ответ здесь, чтобы вызвать другую проблему вашего кода, как вы сказали:

It also fails if I change the RoutedEvent property to Loaded, FrameworkElement.Loaded, Image.Loaded

Это потому, что вы не указали Storyboard.TargetName в вашем DoubleAnimation, он будет бросать исключение, когда он работает. Чтобы решить эту проблему, вам нужно будет дать имя вашей Image в DataTemplate и изменить раскадровку, как это:

<Image x:Name="myImage" Source="{Binding SmallUri}" Stretch="UniformToFill"> 
    <Image.Triggers> 
     <EventTrigger RoutedEvent="Image.Loaded"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimation Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="00:00:5" Storyboard.TargetName="myImage" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Image.Triggers> 
</Image> 
+0

Значит ли '' на самом деле работает? В документации говорится: «Не устанавливайте атрибут RoutedEvent». OP также заявляет, что «он также терпит неудачу, если я изменил свойство RoutedEvent на Loaded». – Clemens

+0

@ Clemens, да, вы правы, установлен ли «RoutedEvent =» Image.Loaded «' здесь или нет, эта раскадровка будет запущена при загрузке этой фреймворка, я воспроизвел проблему OP и нашел, когда изменил свойство RoutedEvent на Loaded , исключение: «Оценка методов на COM-объектах в этом контексте не поддерживается». Если указать имя и заставить целевую систему раскадровки, это имя решит эту проблему. –

+1

@Clemens, это работает, и это означает, что в UWP вы можете либо установить событие «Loaded» на «RoutedEvent», либо оставить этот «RoutedEvent», они будут одинаковыми. –

0

Из Замечания раздел на EventTrigger странице на MSDN:

If you do choose to use Triggers , in Windows Runtime XAML, the default behavior for event triggers and the only event that can be used to invoke an EventTrigger is FrameworkElement.Loaded. Because that's both the default and the only enabled behavior, don't set the RoutedEvent attribute. Just use the XAML <EventTrigger> . For more info, see Triggers .