2013-08-05 78 views
0

我想爲每個「TreeViewItem」樣式以編程方式(在代碼/不是xaml)分配一個新的DataTrigger,就像我在下面的xaml中做的那樣。WPF - TreeView - 如何以編程方式提取TreeViewItem(選定樣式)的樣式

我做了一些代碼(在xaml下)我定義了我的觸發器,但「ItemContainerStyle」爲null。該函數在Window Initialize事件上被調用。

有人有一個想法我做錯了什麼?

編輯

,我發現我的問題的某一部分:我把我的風格從「資源」部分的「ItemContainerStyle」部分如下示例代碼中定義。這樣風格仍然適用,我可以從代碼中的TReeView.ItemContainerStyle屬性訪問樣式。但我仍然不知道如何通過代碼獲取TreeViewItem選擇的樣式,如背景的顏色?

我有XAML:

   <TreeView Name="TreeViewSelectScopeStudy" MinHeight="24" Margin="7" 
        ItemsSource="{Binding Path=TvItemRootPssTreeViewRoot.ChildsView}" Height="Auto" 
        VerticalAlignment="Stretch" 
        VirtualizingStackPanel.IsVirtualizing="True" 
        VirtualizingStackPanel.VirtualizationMode="Recycling"> 
       <TreeView.Resources> 
        <Style TargetType="TreeViewItem"> 
         <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"/> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Path=IsHilighted}" Value="true"> 
           <!--<Setter Property="Background" Value="SlateBlue"></Setter>--> 
           <Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}"></Setter> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 

我有代碼:

public static void EnableMultipleSelection(TreeView treeView) 
    { 
     if (!_isMultiSelectTreeViewLeftButtonHandlerRegistered) 
     { 
      EventManager.RegisterClassHandler(typeof(TreeViewItem), UIElement.MouseDownEvent, 
                  new MouseButtonEventHandler(TreeViewMouseDownGlobal)); 
      _isMultiSelectTreeViewLeftButtonHandlerRegistered = true; 
     } 

     DataTrigger dataTrigger = new DataTrigger(); 
     dataTrigger.Binding = new Binding("IsHilighted"); 
     dataTrigger.Value = true; 
     dataTrigger.Setters.Add(new Setter(TreeViewItem.BackgroundProperty, new SolidColorBrush(Colors.Brown))); 

     treeView.ItemContainerStyle.Triggers.Add(dataTrigger); 

編輯的代碼:

<TreeView Name="TreeViewSelectScopeStudy" MinHeight="24" Margin="7" 
       ItemsSource="{Binding Path=TvItemRootPssTreeViewRoot.ChildsView}" Height="Auto" 
       VerticalAlignment="Stretch" 
       VirtualizingStackPanel.IsVirtualizing="True" 
       VirtualizingStackPanel.VirtualizationMode="Recycling"> 

      <TreeView.ItemContainerStyle> 
       <Style TargetType="TreeViewItem"> 
        <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=IsHilighted}" Value="true"> 
          <Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TreeView.ItemContainerStyle> 

      <TreeView.Resources> 
       <!--<Style TargetType="TreeViewItem"> 
        <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"/> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding Path=IsHilighted}" Value="true"> 
          <Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}"></Setter> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style>--> 

回答

0

這聽起來像你正在嘗試設置樣式。在模板應用之前觸發過早。如果您在FrameWorkElement之後應用觸發器,則您的目標已完全加載,則可能會發現ItemStyleContainer不再爲空。

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.loaded.aspx

實現OnApplyTemplateFrameworkElement應該鉤你在之後的ItemStyleContainer已經被設置爲可視樹已經被渲染後的叫法。

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.onapplytemplate.aspx

+0

嗨林格,謝謝。我並不完全確定,但我認爲所有的xaml都應該在「初始化」處理。我試圖穿上「OnLoaded」而沒有成功。我可以重寫OnApplyTemplate,但我很樂意不這樣做,因爲我想保持我的代碼的通用性。從TreeView派生會影響標準的TreeView利用率(每當我想要做我現在正在做的事時,我將不得不實例化我自己的類)。 –

+0

嗨Eric,OnInitialized只意味着它的元素已通過構造函數,所以所有的屬性都已經初始化。它並不保證可視化樹上的所有元素都已渲染。請參閱初始化第二段。 http://msdn.microsoft.com/en-us/library/ms754221.aspx –

+0

我只是做了測試:使用System.Diagnostics; using System.Windows.Controls; 命名空間MultiSimAnalysis { \t公共類Test3的:樹視圖 \t { \t \t公共覆蓋無效OnApplyTemplate() \t \t { \t \t \t基。OnApplyTemplate(); (this.ItemContainerStyle.ToString());我們可以使用Debug.Print(this.ItemContainerStyle.ToString()); \t \t} \t} } ...並在XAML中使用Test3代替TreeView,但得到相同的NullReferenceException。 –