WPF样式和多态性

时间:2017-08-09 08:13:21

标签: wpf polymorphism styles

我知道我是一个变态者,但我很好奇,有没有办法让自定义控件首先寻找它的基类风格,然后它就是自己的。 为什么我要问:我有一些带有自定义项模板的TreeView派生控件。我应用这些模板,然后我有一个基本风格。后来我可能会应用一些调色板。在最后一步我有一个问题。我需要应用2种风格。 PVStructuralTree派生自TreeView,它有一些DependencyProperty DataTemplates,可以插入到代码中的资源中。

PVStructuralTreeView

  • EmploeeTemplate
  • ...更多模板

PVStructuralTreeView的默认样式:

<Style x:Key="DefaultPVStructuralTreeView" TargetType="{x:Type c:PVStructuralTreeView}" BasedOn="{StaticResource DefaultTreeView}">
    <Setter Property="EmploeeTemplate"><!-- This get inserted inro Resources in code -->
        <Setter.Value>
            <DataTemplate DataType="{x:Type s:Emploee}">
                ...
            </DataTemplate>
        </Setter.Value>
    </Setter>
    ... Lots of them here
</Style>
<Style TargetType="{x:Type c:PVStructuralTreeView}" BasedOn="{StaticResource DefaultPVStructuralTreeView}"/>

TreeView的默认样式(它非常大,所以我不会在这里发布):

<Style TargetType="{x:Type TreeView}" BasedOn="{StaticResource DefaultTreeView}"/>

在color template.xaml文件中,我希望能够同时应用这两种风格(来自Generic.xaml和主题风格):

<Style x:Key="ThemedTreeView" TargetType="{x:Type TreeView}" BasedOn="{StaticResource DefaultTreeView}">
    ...
</Style>

<Style TargetType="{x:Type c:PVStructuralTreeView}" BasedOn="{StaticResource ThemedTreeView}"/>

但它只是覆盖generic.xaml样式。我希望它添加到它。

现在我这样做:

<Style x:Key="ThemedPVStructuralTreeView" TargetType="{x:Type c:PVStructuralTreeView}" BasedOn="{StaticResource DefaultPVStructuralTreeView}">
    ... CopyPaste from ThemedTreeView ...
</Style>

<Style TargetType="{x:Type c:PVStructuralTreeView}" BasedOn="{StaticResource ThemedPVStructuralTreeView}"/>

有谁知道如何在这里重用ThemedTreeView样式?

1 个答案:

答案 0 :(得分:0)

您可以使用Style属性将Style基于另一个(仅限一个!)BasedOn并覆盖特定属性,但不能基于DataTemplate或{ {1}}在另一个模板上。这不受支持。必须将模板定义为整体:

WPF: Is there a way to override part of a ControlTemplate without redefining the whole style?