基于TabItem和主题的WPF自定义控件

时间:2010-06-26 07:09:59

标签: wpf controls

我创建了一个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是不适用于它的主题?

1 个答案:

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