我使用的是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}">
dxet
和dxgt
是DevExpress名称空间。
答案 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
类,为您的自定义按钮注册一些附加属性,路由事件和类级命令处理程序。