2017-08-09 48 views
0

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

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}"/> 

在色彩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风格?

+0

我写到这里完全覆盖通用样式。我想建立它,而不是重写。我在Template.xaml中将ThemedTreeView样式复制到PVStructuralTreeView的样式中,当我想构建现有的样式时,不复制代码。 –

+0

您不能将样式基于其他两种样式。 – mm8

回答

0

您可以使用BasedOn产业基地在另一Style(只有一个!)Style,并覆盖特定的属性,但你不能基地DataTemplate或另一模板ControlTemplate。这不支持。模板必须定义为一个整体:

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

+0

您无法修改派生样式中的模板。您只能设置其他属性或“覆盖”由基本样式设置的属性。那么你目前的问题是什么? – mm8

+0

PVStructuralTree是从TreeView派生而来的,它有一些DependencyProperty模板,它们被插入代码隐藏的资源中。 –

+0

是的,我知道temlates。我有兴趣看看是否有一种棘手的方法将风格放在另外两种风格上。如果没有,那么我会坚持我的CopyPaste方式。 –