如何设置模板化父对象的动画';WPF中的s Panel.ZIndex?

如何设置模板化父对象的动画';WPF中的s Panel.ZIndex?,wpf,animation,storyboard,z-index,Wpf,Animation,Storyboard,Z Index,我试图在数据绑定stackpanel中向前移动一个模板项(ZIndex)。由于stackpanel为其中的每个项目创建ContentPresenter,因此我的可视化树如下所示: ItemsControl Border ItemsPresenter StackPanel ContentPresenter ToggleButton ContentPresenter ToggleButton

我试图在数据绑定stackpanel中向前移动一个模板项(ZIndex)。由于stackpanel为其中的每个项目创建ContentPresenter,因此我的可视化树如下所示:

ItemsControl
  Border
    ItemsPresenter
      StackPanel
        ContentPresenter
          ToggleButton
        ContentPresenter
          ToggleButton
        ContentPresenter
          ToggleButton
<Storyboard x:Key="MyStoryboard" >
    <Int32AnimationUsingKeyFrames BeginTime="0:0:0.000" Duration="0:0:0.350" 
          Storyboard.TargetProperty="TemplatedParent.(Panel.ZIndex)" >
        <Int32KeyFrameCollection>
            <DiscreteInt32KeyFrame KeyTime="0:0:0.000" Value="99" />
        </Int32KeyFrameCollection>
    </Int32AnimationUsingKeyFrames>
</Storyboard>       



<Style x:Key="SubStateOptionButtonStyle" TargetType="ToggleButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">

                <!-- Toggle Button Contents here -->

                <ControlTemplate.Triggers>
                    <EventTrigger RoutedEvent="Button.Click">
                        <EventTrigger.Actions>
                            <BeginStoryboard Storyboard="{StaticResource MyStoryboard}" />
                        </EventTrigger.Actions>
                    </EventTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Panel.SetZIndex((sender as ToggleButton).TemplatedParent as UIElement, 99);
单击ToggleButton时,它会触发一个故事板,如下所示:

ItemsControl
  Border
    ItemsPresenter
      StackPanel
        ContentPresenter
          ToggleButton
        ContentPresenter
          ToggleButton
        ContentPresenter
          ToggleButton
<Storyboard x:Key="MyStoryboard" >
    <Int32AnimationUsingKeyFrames BeginTime="0:0:0.000" Duration="0:0:0.350" 
          Storyboard.TargetProperty="TemplatedParent.(Panel.ZIndex)" >
        <Int32KeyFrameCollection>
            <DiscreteInt32KeyFrame KeyTime="0:0:0.000" Value="99" />
        </Int32KeyFrameCollection>
    </Int32AnimationUsingKeyFrames>
</Storyboard>       



<Style x:Key="SubStateOptionButtonStyle" TargetType="ToggleButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">

                <!-- Toggle Button Contents here -->

                <ControlTemplate.Triggers>
                    <EventTrigger RoutedEvent="Button.Click">
                        <EventTrigger.Actions>
                            <BeginStoryboard Storyboard="{StaticResource MyStoryboard}" />
                        </EventTrigger.Actions>
                    </EventTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Panel.SetZIndex((sender as ToggleButton).TemplatedParent as UIElement, 99);
但是我想用情节提要来制作动画,最好是用直接的XAML,因为它需要在情节提要的整个过程中保持向前,然后回到它原来的位置


我曾考虑过从ItemsControl继承以防止创建ContentPresenter,但这是一个非常简单的解决方案。

以下是这个问题的答案: (朱民)

您的原始代码无法工作,因为TemplatedParent不是依赖项属性。因此,它不是动画的有效路径

代码TI82表明是正确的。它仍然不起作用,因为TemplatedParent是按钮。但要设置动画的元素是项目容器

要设置项目容器的动画,可以使用ItemsControl的ItemContainerStyle。Click是一个冒泡路由事件,因此它也会从按钮冒泡到项目容器

请尝试以下代码

<Window.Resources>
    <Storyboard x:Key="MyStoryboard">
      <ColorAnimation Storyboard.TargetName="ButtonRect" 
                            Storyboard.TargetProperty="(Rectangle.Fill).(SolidColorBrush.Color)" 
                            To="Red" 
                            Duration="0:0:0.350"
                            FillBehavior="Stop"/>
    </Storyboard>

    <Style x:Key="MyButtonStyle" TargetType="Button">
      <Setter Property="Panel.ZIndex" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContentPresenter}, Mode=OneWayToSource, Path=(Panel.ZIndex)}"/>
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="Button">
            <Grid Height="60" Margin="0,0,0,-10" >
              <Border BorderBrush="Black" BorderThickness="2" CornerRadius="15">
                <Rectangle x:Name="ButtonRect" RadiusX="15" RadiusY="15" Fill="AliceBlue" />
              </Border>
              <TextBlock Text="{Binding}" FontSize="15" TextAlignment="Center" VerticalAlignment="Center"/>
            </Grid>
            <ControlTemplate.Triggers>
              <EventTrigger RoutedEvent="Button.Click">
                <EventTrigger.Actions>
                  <BeginStoryboard Storyboard="{StaticResource MyStoryboard}" />
                </EventTrigger.Actions>
              </EventTrigger>
            </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>

    <DataTemplate x:Key="MyButtonTemplate">
      <Grid>
        <Button Style="{StaticResource MyButtonStyle}" />
      </Grid>
    </DataTemplate>


    <Storyboard x:Key="MyStoryboard2">
      <Int32AnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.ZIndex)" 
       BeginTime="0:0:0.000" Duration="0:0:0.350" FillBehavior="Stop">
        <Int32KeyFrameCollection>
          <DiscreteInt32KeyFrame KeyTime="0:0:0.000" Value="99" />
        </Int32KeyFrameCollection>
      </Int32AnimationUsingKeyFrames>
    </Storyboard>

    <Style x:Key="MyItemContainerStyle">
      <Style.Triggers>
        <EventTrigger RoutedEvent="Button.Click">
          <BeginStoryboard Storyboard="{StaticResource MyStoryboard2}"/>
        </EventTrigger>
      </Style.Triggers>
    </Style>
  </Window.Resources>

  <Grid>
    <ItemsControl ItemsSource="ABCDEF" 
           ItemTemplate="{StaticResource MyButtonTemplate}" 
           ItemContainerStyle="{StaticResource MyItemContainerStyle}">
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <StackPanel Orientation="Vertical" />
        </ItemsPanelTemplate>
      </ItemsControl.ItemsPanel>
    </ItemsControl>
  </Grid>


您如何知道对哪种属性类型使用哪种动画?tere是否是所有动画类型的平面列表,如doubleAnimation、BooleanAnimationUsingKeyFrames、ObjectAnimationUsingKeyFrames等,以及它们可以用于什么?如果我正确理解您的问题:此解决方案特定于按钮列表。它特定于为按钮单击事件执行特定动画。您可以创建多种类型的动画。我认为创建动画的最佳工具是“Microsoft Expression Blend”。