我想爲每個「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>-->
嗨林格,謝謝。我並不完全確定,但我認爲所有的xaml都應該在「初始化」處理。我試圖穿上「OnLoaded」而沒有成功。我可以重寫OnApplyTemplate,但我很樂意不這樣做,因爲我想保持我的代碼的通用性。從TreeView派生會影響標準的TreeView利用率(每當我想要做我現在正在做的事時,我將不得不實例化我自己的類)。 –
嗨Eric,OnInitialized只意味着它的元素已通過構造函數,所以所有的屬性都已經初始化。它並不保證可視化樹上的所有元素都已渲染。請參閱初始化第二段。 http://msdn.microsoft.com/en-us/library/ms754221.aspx –
我只是做了測試:使用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。 –