2016-11-15 4 views
1

Таким образом, мы пытаемся retemplate некоторого запаса элементов управления WPF, изменяя их стили по умолчанию в Generic.xamlНевозможно переопределить стиль по умолчанию управления WPF в Generic.xaml

Когда мы обычно делаем это мы подкласс управления, а затем переопределите ключ стиля по умолчанию элемента управления подкласса в его статическом инициализаторе. Тем не менее, мы пытаемся просто переопределить базовый элемент управления без подклассификации. Таким образом, любой пользователь в компании, использующий управление запасами wpf, получит наш новый стиль по умолчанию.

Возможно, я не могу заставить это работать.

В моем приложении для песочницы, которое является утомительной версией нашей реальной проблемы, у меня есть следующее.

MainWindow.xaml

<StackPanel> 
    <TextBlock>It doesn't work</TextBlock> 
    <local:CustomTextBlock>It works</local:CustomTextBlock> 
</StackPanel> 

Темы/Generic.xaml

<Style TargetType="{x:Type TextBlock}"> 
    <Setter Property="FontSize" Value="100" /> 
</Style> 


<Style TargetType="{x:Type test:CustomTextBlock}"> 
    <Setter Property="FontSize" Value="100" /> 
</Style> 

CustomTextBlock.cs

public class CustomTextBlock : TextBlock 
{ 
    static CustomTextBlock() 
    { 
     Type _CustomTextBlock = typeof(CustomTextBlock); 
     DefaultStyleKeyProperty.OverrideMetadata(
      _CustomTextBlock, 
      new FrameworkPropertyMetadata(_CustomTextBlock)); 
    } 
} 

В результате этого отображается.

enter image description here

Моя теория состоит в том, что двигатель WPF игнорирует наш стиль, потому что ключ стиля по умолчанию либо A: не переопределяется или B: это найти свой стиль в их Generic.xaml первым.

Мой вопрос: есть ли работа для этого? Правильны ли мои предположения?

UPDATE:

Согласно эталонного источника, в качестве ключа по умолчанию стиль переопределяется в управлении МОФ запаса для TextBlock.cs в этом случае

Reference Source TextBlock.cs (линия 346)

ответ

2

Для этого вы можете поместить свои стили непосредственно в App.xaml или в отдельный ResourceDictionary (named DefaultStyles.xaml).

Внесение непосредственно в App.xaml достаточно просто, просто введите стиль в элемент «Ресурсы».

Если вы хотите поместить стили в файл (это полезно, если вы хотите стили для нескольких приложений или в пределах нескольких сборок) вы добавляете его к MergedDictionaries вашего App.xaml как таковой

<Application x:Class="MyAwesomeApp" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Themes/DefaultStyles.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

Предполагается, что вы поместили файл DefaultStyles в папку «Темы». Если в другом сборке вы сделаете следующее:

<ResourceDictionary Source="/Company.Controls.UI;component/DefaultStyles.xaml"/> 
+1

Обратите внимание, что имя 'DefaultStyles.xaml' может быть любым. Это было всего лишь примерное имя –

1

Имеют посмотрите на this post (Что особенного в Generic.xaml).

Основной вопрос, кажется:

WPF ищет стиль по умолчанию в специальном словаре ресурсов в темах папке в той же сборке как элемент управления.

«Ваше» управление определено в «вашей» сборке, TextBlock определено в PresentationFramework. Таким образом, вам лучше создать еще один ResourceDictionary для повторного моделирования стандартных элементов управления и включить/объединить его в каждый из ваших xaml-документов (я полагаю, это больно).

Надеюсь, это поможет.

Смежные вопросы