C# 动画样式被覆盖
我正在为我所有的树视图制作动画 拥有具有以下功能的app.xaml:C# 动画样式被覆盖,c#,wpf,silverlight,xaml,C#,Wpf,Silverlight,Xaml,我正在为我所有的树视图制作动画 拥有具有以下功能的app.xaml: <Style TargetType="{x:Type TreeView}"> <Style.Resources> <Style TargetType="{x:Type TreeViewItem}"> <Style.Triggers> <EventTrigger RoutedEvent="Tree
<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>
<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>
//做些工作
动画将不再工作。
是否有任何解决方案或解决方法?我真的不想把整个动画代码放在树视图中…1)使用现有的样式创建一个名为style的基础
<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>
这里的现有风格
您正在使用定义触发器的动画样式覆盖动画样式。样式的解析方式与任何其他WPF资源类似:它将沿着逻辑树遍历,直到找到一个并停止。在您的情况下,它将找到带有触发器的样式,并且不会继续。Phil的解决方案是正确的,使用BasedOn从动画样式继承触发器样式。@Claudiu哦,所以没有解决方案可以说将动画样式应用于任何树,不管它们为触发器定义了什么?因为我正试图找到一种方法,我可以在不改变树视图上的代码的情况下全局应用它们。恐怕不行。如果不手动设置样式,它将被设置为在treeView资源(包括继承的资源)中找到的第一个样式。不管怎样,您都在应用触发器样式(将其放在treeView资源字典中),因此只需继续从动画样式派生触发器样式。但在这个解决方案中,这意味着我必须转到每个样式中包含触发器并基于动画样式扩展其样式的treeView
?没有解决方案可以应用动画,无论它们在TreeView样式中定义了什么?或者全局地说,所有TreeViewItem
样式都将是BaseOn
我在App.xaml中定义的样式?另一种方法是定义几个“基本”treeview样式-根据需要的数量-然后在每个树视图上指定style={}。或者在每个作用域中,基于所选的基本样式创建一个无键样式,该样式将影响该作用域中的所有TreeView。