0

我想以编程方式(在代码/不是 xaml 中)为每个“TreeViewItem”样式分配一个新的 DataTrigger,就像我在下面的 xaml 中所做的那样。

我做了一些代码(在 xaml 下),在其中定义了我的触发器,但“ItemContainerStyle”为空。该函数在 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>-->
4

1 回答 1

0

听起来您正试图在应用模板之前过早设置 Style.Trigger。如果您在FrameWorkElement目标完全加载后应用触发器,您可能会发现ItemStyleContainer不再为空。

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

OnApplyTemplate在设置 ItemStyleContainer 后为您实现FrameworkElement应该挂钩,因为它是在渲染可视树后调用的。

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

于 2013-08-05T17:51:51.143 回答