我创建了一个Generic.xaml主题,为所有常用控件设置样式,包括TabItem 它们适用于应用程序中的所有控件
当我创建一个TabItem控件并显示它时,它会获得Theme OK。
TabItem t = new TabItem();
t.Header = "Normal";
MainContentControl.Items.Add(t);
但是,当我基于TabItem
创建自定义控件时 public partial class ClosableTab : TabItem
并显示它
ProActive.LocalControls.ClosableTab ct = new ProActive.LocalControls.ClosableTab();
ct.Header = "COMP";
MainContentControl.Items.Add(ct);
主题被忽略。
我已尝试使用
编写其defaultstyle DefaultStyleKeyProperty.OverrideMetadata(typeof(ClosableTab), new FrameworkPropertyMetadata(typeof(TabItem)));
为什么我的自定义控件基于TabItem是不适用于它的主题?
答案 0 :(得分:0)
DefaultStyleKey仅用于查找主题样式。必须根据控件程序集中指定的ResourceDictionaryLocation在定义控件的程序集中或相关程序集中定义主题样式。 TabItem主题位于PresentationFramework.Aero中,WPF将在程序集中查找ClosableTab主题,因此即使它们具有相同的键,也无法找到它们。 Here很好地描述了WPF如何查找主题样式。
将始终使用控件的实际类型查找隐式样式,因此如果资源字典中有<Style TargetType="TabItem">
,则它不会影响ClosableTab
。
让ClosableTab从TabItem继承隐式样式的最简单方法是为ClosableTab创建隐式样式并使用BasedOn:
<Style TargetType="local:ClosableTab" BasedOn="{StaticResource {x:Type TabItem}}" />