WPF,自定义控件和样式/主题继承

时间:2017-03-22 10:26:16

标签: xaml wpf-controls

我正在开展一个已经存在的项目,我无法按照自己的方式进行样式设计。

我从一个应用程序开始:

  • Resources 文件夹中有 WhistlerBlue.xaml 文件。
  • 文件中的样式使用 TargetType 自动应用
  • Expander 控件定义了一种样式(更多关于此内容,下一篇)
  • 我不想弄乱这个档案。
  • 通过 App.xaml
  • 中的合并资源在应用程序中显式使用该文件

到目前为止,一切正常。

则...

我正在构建一个源自 Expander

的自定义控件
internal partial class TestExpander : Expander

通过创建自定义控件,VStudio已将主题文件夹添加到项目中,其中包含常用的 Generic.xaml 文件。在这个文件中,我为自定义控件创建了样式:

<Style TargetType="{x:Type local:TestExpander}" BasedOn="{StaticResource {x:Type Expander}}">
    <Style.Resources>
        <BooleanToVisibilityConverter x:Key="BooleanToVisibility"/>
    </Style.Resources>

    <Setter Property="ExpandDirection" Value="Down"/>
    <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
    <Setter Property="HorizontalAlignment" Value="Stretch"/>
    <Setter Property="VerticalAlignment" Value="Top"/>
    <Setter Property="Cursor" Value="Hand"/>
</Style>

显然在自定义控件的代码中我有:

static TestExpander()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(TestExpander), new FrameworkPropertyMetadata(typeof(TestExpander)));
        }

我期望 TestExpander 继承 WhistlerBlue.xaml 中定义的 Expander 样式,并通过自己的样式添加自己的自定义从那以后他们都过着幸福的生活。

没有发生。我哪里错了?

1 个答案:

答案 0 :(得分:3)

因此,当我们为各种事物创建我们的继承体系结构时,很容易忘记事物接收其继承部分的顺序。因此,当我们举一个直接关注x:Type的基于OnOn然后它会按照继承的顺序寻找它时,它可用吗?

当它正在寻找x:Type并且它不知道另一个词典中的覆盖时...他只是直接进入默认原始版本。但是,如果我们注入包含您希望从via ResourceDictionary.MergedDictionaries继承的字典的字典,那么它知道在他回到框架默认值之前先看看他,并且一切都在世界上很好。< / p>

但是,请注意,当您以这种方式合并字典以进行继承时,您必须注意如何执行此操作,否则可能会导致性能下降。因为它说它是一个合并的字典....在运行时它会将字典中的所有东西合并,并将所有字母的副本复制到新字典中。

所以对于这个实例....如果它是我,我可能会省略那个generic.xaml字典内容,如果它不是真的有必要,并将该模板放在现有字典的正下方希望继承的是#39;然后你不再制作整本字典的另一个副本,它仍然会得到它的继承,而生活应该是很好的。希望这可以帮助。 :)