wpf:ItemsContainerStyle的设置重写了自定义TreeViewControl的所有自定义样式

时间:2013-07-24 19:32:43

标签: wpf xaml treeview custom-controls

我开发了自定义TreeView(称之为MyTree)。在ResourceDictionary这个自定义控件的General.xaml中,我为TreeViewItem定义了设置控件模板的样式,我需要显示每个项目。首先,我创建了特殊的ControlTemplate:

<ControlTemplate TargetType="{x:Type TreeViewItem}" x:Key="MyTreeViewItem">
.........
</ControlTemplate>

然后我在MyTree的自定义样式中使用它:

<Style TargetType="{x:Type local:MyTree}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MyTree}">
                <ControlTemplate.Resources>
                    <Style TargetType="{x:Type TreeViewItem}">
                        <Setter Property="Template" Value="{StaticResource MyTreeViewItem}" />
                    </Style>
                </ControlTemplate.Resources>
                ..........
                <ItemsPresenter />
                ..........
             </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

一切正常,而我使用我的控件:

<local:MyTree>
     <local:MyTree.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding DependentSuites}"/>
     </local:MyTree.ItemTemplate>
     ..........other property specific for MyTree control.............
</local:MyTree>
enter code here

当我尝试为TreeViewItem添加样式时,它确实出错了。例如,以下代码

<local:MyTree>
     <local:MyTree.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding DependentSuites}"/>
     </local:MyTree.ItemTemplate>
     ..........other property specific for MyTree control.............
     <local:MultiColumnTreeView.Resources>
            <Style TargetType="TreeViewItem"
                <Setter Property="Background" Value="Red"/>
            </Style>
        </local:MultiColumnTreeView.Resources>
</local:MyTree> 

导致wpf重置我的自定义模板并开始使用TreeViewItem的默认样式。如果我为ItemsContainerStyle设置任何值,则会出现相同的情况。换句话说,任何样式修改都会在General.xaml中重写我的自定义样式。为什么会这样,以及如何避免这种情况,结合所有风格。

1 个答案:

答案 0 :(得分:2)

您可以将其基于您想要的任何现有样式,并且只修改实例所需的内容,就像您使用Style BasedOn Property一样;

<Style TargetType="TreeViewItem" 
       BasedOn="{StaticResource YourExistingStyleYouWantToBaseItOn}">
    <Setter Property="Background" Value="Red"/>
</Style>

希望这有助于。