动画样式被覆盖

本文关键字:覆盖 样式 动画 | 更新日期: 2023-09-27 18:28:21

我正在为我所有的TreeView制作动画。。。。。

有一个app.xaml与:

<Style TargetType="{x:Type TreeView}">
    <Style.Resources>
        <Style TargetType="{x:Type TreeViewItem}">
            <Style.Triggers>
                <EventTrigger RoutedEvent="TreeViewItem.Loaded">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                             From="0" To="1" BeginTime="00:00:00" Duration="00:00:01" FillBehavior="Stop"/>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Style.Triggers>
        </Style>
      </Style.Resources>
</Style>

它适用于每个TreeView,我可以看到TreeViewItem逐渐消失。

但是,如果TreeView的定义如下,触发器的样式为:

   <TreeView>
        <TreeView.Resources>
            <Style TargetType="{x:Type TreeViewItem}">
                <Style.Triggers>
                    <Trigger Property="IsEnabled" Value="True">
                          //Do some work
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TreeView.Resources>
        <TreeViewItem Header="Item1">
            <TreeViewItem Header="Item2">
                <TreeViewItem Header="Item3"/>
                <TreeViewItem Header="Item4"/>
            </TreeViewItem>
            <TreeViewItem Header="Item5"/>
        </TreeViewItem>            
        <TreeViewItem Header="Item6"/>
    </TreeView>

动画将不再工作。对此有什么解决方案或变通方法吗?我真的不想把整个动画代码放在TreeView中。。。

动画样式被覆盖

1)使用现有样式创建一个基本命名样式

<Style x:Key="baseTreeViewStyle" 
       TargetType="{x:Type TreeViewItem}"> existing style here </Style>

2) 根据你的基本风格创建一个没有名字的风格-这将是你隐含的全局风格

<Style TargetType="{x:Type TreeViewItem}" 
       BasedOn={StaticResource baseTreeViewStyle} />

3) 在树状视图中扩展基本样式

<Style TargetType="{x:Type TreeViewItem}" 
       BasedOn="{StaticResource baseTreeViewStyle}">
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="True">
              //Do some work
        </Trigger>
    </Style.Triggers>
</Style>

现在,您可以获得一个隐式全局样式,但如果需要特定的附加行为,则可以覆盖基本样式。

为了更彻底,您的基本样式应该基于默认的TreeViewItem样式

<Style x:Key="baseTreeViewStyle" 
       TargetType="{x:Type TreeViewItem}" 
       BasedOn="{StaticResource {x:Type TreeViewItem}}"> 
           existing style here 
</Style>