WPF ItemsControl DataTrigger EnterActions Анимация не запускается - PullRequest
0 голосов
/ 14 сентября 2018

У меня проблема с анимацией в шаблоне ItemsControl, который является частью шаблона другого ItemsControl.Я хочу, чтобы путь, представляющий значок, менял цвет и постоянно вращался, когда определенное условие становится истинным.

DataTrigger обычно работает, в результате чего Fill пути изменяется с серого на серыйLightGreen, когда свойство producing изменяется на true.Однако анимация не запускается.Когда я позволяю анимации начинаться с события Loaded (как вы можете видеть в разделе с комментариями), она запускается правильно.Итак, я знаю, что анимация, как и DataTrigger, настроена правильно.Когда я помещаю тот же самый Path (просто скопируйте и вставляю) во внешнюю ItemsControl и меняю DataTrigger на свойство соответствующего DataType, анимация также работает, как и ожидалось.Так что, похоже, проблема с вложенными ItemsControls, но я понятия не имею, что это может быть.

<ItemsControl ItemsSource="{Binding Computers}">
    <ItemsControl.ItemTemplate>
      <DataTemplate DataType="{x:Type models:ClientComputerWrapper}">
        <Border Margin="5" BorderBrush="Black" BorderThickness="1" Padding="5">
          <StackPanel>

            <!-- Some Content -->

            <ItemsControl ItemsSource="{Binding PlcReaderStatuses}">
              <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type resources:PlcReaderStatusResource}">
                  <DockPanel LastChildFill="False">

                    <!-- Some Content -->

                    <Path DockPanel.Dock="Left" HorizontalAlignment="Left" Data="{StaticResource GearIconGeometry}" Stretch="Uniform" RenderTransformOrigin="0.5, 0.5">
                      <Path.RenderTransform>
                        <RotateTransform x:Name="gearPathTransform"/>
                      </Path.RenderTransform>
                      <Path.Style>
                        <Style TargetType="Path">
                          <Setter Property="Fill" Value="Gray"/>
                          <Style.Triggers>
                            <DataTrigger Binding="{Binding IsProducing}" Value="True">
                              <Setter Property="Fill" Value="LightGreen"/>
                              <DataTrigger.EnterActions>
                                <BeginStoryboard x:Name="rotateStoryBoard">
                                  <Storyboard>
                                    <DoubleAnimation Storyboard.TargetProperty="(Path.RenderTransform).(RotateTransform.Angle)" To="360" Duration="0:0:2" RepeatBehavior="Forever"/>
                                  </Storyboard>
                                </BeginStoryboard>
                              </DataTrigger.EnterActions>
                              <DataTrigger.ExitActions>
                                <RemoveStoryboard BeginStoryboardName="rotateStoryBoard"/>
                              </DataTrigger.ExitActions>
                            </DataTrigger>
                            <EventTrigger RoutedEvent="Loaded">
                              <!--<BeginStoryboard x:Name="rotateStoryBoard">
                                <Storyboard>
                                  <DoubleAnimation Storyboard.TargetProperty="(Path.RenderTransform).(RotateTransform.Angle)" To="360" Duration="0:0:2" RepeatBehavior="Forever"/>
                                </Storyboard>
                              </BeginStoryboard>-->
                            </EventTrigger>
                          </Style.Triggers>
                        </Style>
                      </Path.Style>
                    </Path>
                  </DockPanel>
                </DataTemplate>
              </ItemsControl.ItemTemplate>
            </ItemsControl>

          </StackPanel>
        </Border>
      </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

1 Ответ

0 голосов
/ 14 сентября 2018

Я наконец нашел решение. После попытки заменить DoubleAnimation на ColorAnimation, используя (Path.Fill).(SolidColorBrush.Color) в качестве TargetProperty, я получил ошибку, что путь не указывает на DependencyProperty. Это было решено только тогда, когда я определил SolidColorBrush явно в Setter, что заставило меня попробовать то же самое с RenderTransform из Path:

<Path.Style>
  <Style TargetType="Path">
    <Setter Property="RotateTransform">
      <Setter.Value>
        <RotateTransform x:Name="gearPathTransform"/>
      </Setter.Value>
    </Setter>

    <!-- ... -->

  </Style>

После этого анимация работает как положено. Я до сих пор не знаю, почему это необходимо только для внутреннего ItemsControl, и также неприятно, что нет ошибки, как для ColorAnimation, но, по крайней мере, сейчас это работает.

...