Установка свойства TargetType стиля для базового класса - PullRequest
42 голосов
/ 22 июня 2009

Я просто немного покопался в WPF и хотел, чтобы все элементы в моем окне имели одинаковое поле. Я обнаружил, что все элементы управления, которые могут иметь запас, происходят от FrameworkElement, поэтому я попробовал следующее:

<Window.Resources>
<Style TargetType="{x:Type FrameworkElement}">
    <Setter Property="Margin" Value="10" />
</Style>
</Window.Resources>

И это не работает. Я могу применить это ко всем кнопкам, но не ко всем элементам, производным от кнопки. Я что-то упустил или это просто невозможно?

Разве я чувствую, что использование CSS для WPF было бы хорошей идеей?

Ответы [ 2 ]

57 голосов
/ 22 июня 2009

К сожалению, вы не можете применять стили к базовому типу 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>

7 голосов
/ 24 сентября 2009

Проблема в том, что при поиске стиля WPF не выполняет поиск по всем классам, из которых происходит текущий класс. Однако вы можете дать стилю ключ и применить его ко всем элементам, для которых вы хотите иметь общее свойство. Если в стиле указано свойство, которое нельзя применить к стилизуемому элементу, оно игнорируется.

...