WPF ItemsControl DataTrigger EnterActions动画未启动

问题描述 投票:1回答:1

我在ItemsControl模板中的动画有问题,这是另一个ItemsControl的模板的一部分。我想要一个代表一个Icon的路径来改变它的颜色,并在某个条件变为真时不断旋转。

DataTrigger属性变为Fill时,producing通常起作用,导致Path的true从Gray变为LightGreen。但是,动画无法启动。当我让动画以Loaded事件开始时(正如您在评论部分中看到的那样),它会正常启动。所以我知道动画以及DataTrigger配置正确。当我在外面的ItemsControl中放置相同的Path(只是复制和粘贴)并将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>
wpf animation storyboard datatrigger
1个回答
1
投票

我终于找到了解决方案。在尝试用DoubleAnimation替换ColorAnimation之后,使用(Path.Fill).(SolidColorBrush.Color)作为TargetProperty,我收到错误,该路径未指向DependencyProperty。只有当我在SolidColorBrush中明确定义Setter时才能解决这个问题,这导致我尝试使用RenderTransformPath

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

    <!-- ... -->

  </Style>

之后动画按预期工作。我仍然不知道为什么这只是内部ItemsControl所必需的,并且ColorAnimation没有错误也是令人讨厌的,但至少它现在正在工作。

© www.soinside.com 2019 - 2024. All rights reserved.