是否可以告诉ControlTemplate资源仅将其自身应用于我继承的控件?

时间:2018-01-22 13:25:24

标签: c# wpf inheritance controltemplate

我使用的是DevExpress GridControl,我从中继承了一个类。该类只是C#中的一个类,它添加了一些依赖属性,它没有XAML页面。

在我的ResourceDictionary中,我定义了两个元素:一个ControlTemplate向网格的搜索控件添加一些按钮,一个Style调整搜索控件的边距/填充属性。它们使用Key标识符,使它们适用于我使用的每个网格。但是我真的只希望它们在网格是我继承的类型时应用。

如何让这两个元素仅应用于我继承的控件,而不是基础网格控件?

当前的热门标签定义:

<ControlTemplate x:Key="{dxet:SearchControlThemeKey ResourceKey=Template, ThemeName=MyTheme}">

<Style x:Key="{dxgt:TableViewThemeKey ThemeName=MyTheme, ResourceKey=SearchPanelContentTemplate}"
       TargetType="{x:Type ContentControl}">

dxetdxgt是DevExpress名称空间。

1 个答案:

答案 0 :(得分:2)

最直接的解决方案可能是在自定义网格控件的默认Style内声明这些资源:

<Style TargetType="local:MyGridControl"
       BasedOn="{x:Static dxg:GridControl}">

    <!-- TODO: Double check the BasedOn style key above. -->

    <!-- Put any *new* setters, triggers, etc. here. -->
    <!-- You'll already inherit the setters and triggers from the BasedOn style. -->

    <Style.Resources>

      <!-- Resources only visible in the context of your custom grid's style: -->

      <ControlTemplate x:Key="{dxet:SearchControlThemeKey ResourceKey=Template, ThemeName=MyTheme}" />

      <Style x:Key="{dxgt:TableViewThemeKey ThemeName=MyTheme, ResourceKey=SearchPanelContentTemplate}"
             TargetType="{x:Type ContentControl}" />

    </Style.Resources>
</Style>

将上述样式放在 Themes \ Generic.xaml 资源字典中,该字典位于声明自定义网格控件的同一程序集中。这是WPF将探测默认控件样式的标准位置。如果您的AssemblyInfo.cs尚未包含此类条目,请添加以下内容:

[assembly: ThemeInfo(
    // Where theme specific resource dictionaries are located
    // (used if a resource is not found in the page, or application
    // resource dictionaries)
    ResourceDictionaryLocation.None,

    // Where the generic resource dictionary is located
    // (used if a resource is not found in the page, app, or 
    // any theme specific resource dictionaries)                                 
    ResourceDictionaryLocation.SourceAssembly 
)]

结果应该是自定义网格的实例将看到被覆盖的资源,但标准GridControl的实例将看到默认版本。

确保覆盖自定义网格的默认样式键:

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

替代提案

您是否考虑使用附加依赖项属性向现有网格控件添加新功能,而不是使用您自己的子类扩展它?

根据您所做的一切,最好声明一个GridExtensions类,为您的自定义按钮注册一些附加属性,路由事件和类级命令处理程序。