2012-03-19 148 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