Подтвердить что ты не робот

Установка свойства свойства TargetType в базовый класс

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

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

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

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

4b9b3361

Ответ 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 не выполняет поиск по всем классам, из которых выводится текущий. Однако вы можете придать стилю ключ и применить его ко всем элементам, для которых вы хотите иметь общее свойство. Если свойство указано в стиле, который не может быть применен к стилю, который вы ставите, он игнорируется.