2012-03-19 150 views
0

我正在动画为我所有的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的内部...

+0

您与定义触发一个覆盖你的动画风格。样式被解析的方式就像任何其他WPF资源一样:它将沿着逻辑树遍历,直到它找到并停止。在你的情况下,它会找到与触发器的风格,不会继续下去。菲尔解决方案是正确的,使用BasedOn从动画风格继承您的触发器样式。 – 2012-03-19 18:18:26

+0

@Claudiu哦,所以没有解决方案,我可以说动画风格适用于任何树,无论他们定义的触发器?因为我试图找到一个可以在不改变TreeView上的代码的情况下全局应用它们。 – 2012-03-19 18:53:29

+0

恐怕不是。如果不手动设置样式,它将设置为treeView资源中的第一个查找(包括继承资源)。无论如何,您正在应用触发器样式(将其放置在treeView资源字典中),所以继续从动画样式派生您的触发器样式。 – 2012-03-19 19:08:29

回答

0

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> 

现在你得到一个隐式的全局样式,但是如果你需要特定的附加行为,你可以覆盖基础样式。

为了更加透彻的基本样式,应根据默认的树型视图风格

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

但在这个解决方案中,这意味着我必须去每一个''TreeView'触发他们的风格,并扩大他们的风格基础的动画风格?没有解决方案可以应用动画,无论他们在TreeView风格中定义了什么?或者让它在全球范围内声称所有'TreeViewItem'风格将会是'BaseOn',我在App.xaml中定义了什么? – 2012-03-19 18:55:34

+0

另一种方法是定义几个“基础”树视图样式 - 尽可能多的 - 然后在每个树视图中指定style = {}。或者在每个范围内创建基于所选基本样式的无钥匙样式,然后影响该范围内的所有树视图。 – Phil 2012-03-19 20:10:27