Пользовательский элемент управления WPF на основе TabItem и тем - PullRequest
1 голос
/ 26 июня 2010

У меня есть созданная тема Generic.xaml, которая устанавливает стили для всех общих элементов управления, включая TabItem. Они применяются ко всем элементам управления в приложении ok.

Когда я создаю элемент управления 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);

Тема игнорируется.

Я попытался переписать его стиль по умолчанию, используя

 DefaultStyleKeyProperty.OverrideMetadata(typeof(ClosableTab), new FrameworkPropertyMetadata(typeof(TabItem)));

Почему, если мой пользовательский элемент управления основан на TabItem, тема не применяется к нему?

1 Ответ

0 голосов
/ 26 июня 2010

DefaultStyleKey используется только для поиска стилей темы . Стили темы должны быть определены в сборке, определяющей элемент управления, или в связанной сборке в соответствии с ResourceDictionaryLocation , указанным в сборке элемента управления. Темы TabItem находятся в PresentationFramework. Aero и WPF будут искать темы ClosableTab в вашей сборке, поэтому даже если они имеют одинаковый ключ, он не найдет их. Здесь - хорошее описание того, как WPF ищет стили темы.

Неявные стили всегда будут просматриваться с использованием фактического типа элемента управления, поэтому, если в вашем словаре ресурсов есть <Style TargetType="TabItem">, это не повлияет на ClosableTab.

Самый простой способ заставить ClosableTab наследовать неявный стиль от TabItem - это создать неявный стиль для ClosableTab и использовать BasedOn :

<Style TargetType="local:ClosableTab" BasedOn="{StaticResource {x:Type TabItem}}" />
...