Установка свойства свойства TargetType в базовый класс
Я просто слегка подшутил в WPF и хотел, чтобы все элементы в моем окне делились одинаковой маржой.
Я обнаружил, что все элементы управления, которые могут иметь маржу, получают из FrameworkElement, поэтому я пробовал следующее:
<Window.Resources>
<Style TargetType="{x:Type FrameworkElement}">
<Setter Property="Margin" Value="10" />
</Style>
</Window.Resources>
И это не работает.
Я могу применить это ко всем кнопкам, но не ко всем элементам, которые производятся от Button.
Я что-то пропустил или это просто невозможно?
Я чувствую, что единственное, что нравится использовать CSS для WPF, было хорошей идеей?
Ответы
Ответ 1
К сожалению, вы не можете применять стили к базовому типу FrameworkElement; в то время как WPF позволит вам написать стиль, он не будет применяться к элементам управления, которые вытекают из него. По-видимому, это также относится к подтипам FrameworkElement, например. ButtonBase, супертип Button/ToggleButton/RepeatButton.
Вы все еще можете использовать наследование, но вам придется использовать явный синтаксис BasedOn
, чтобы применить его к типам управления, к которым вы хотите применить.
<Window.Resources>
<Style TargetType="{x:Type FrameworkElement}">
<Setter Property="Margin" Value="10" />
</Style>
<Style TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type FrameworkElement}}" />
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type FrameworkElement}}" />
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type FrameworkElement}}" />
</Window.Resources>
Ответ 2
Проблема заключается в том, что при поиске стиля WPF не выполняет поиск по всем классам, из которых выводится текущий. Однако вы можете придать стилю ключ и применить его ко всем элементам, для которых вы хотите иметь общее свойство. Если свойство указано в стиле, который не может быть применен к стилю, который вы ставите, он игнорируется.