ДА: это полностью выполнимо, Вы можете назначить переопределяющие свойства непосредственно на элемент, не выполняя уродливый процесс, который многие используют для создания специальной одноразовой словарной записи только для конкретного рассматриваемого элемента.
Я не знаю, вызвано ли это ошибкой в WPF, но есть начальное требование ...
Ваш базовый стиль, на который ссылается словарь, может включать в себя любые свойства, которые вы хотите использоватьпереопределение.По какой-то причине разные свойства проявляют разное поведение.Но, по крайней мере, в случае Padding, если вы не включите Padding в свой шаблон TemplateBinding ControlTemplate, вы не сможете переопределить его в своем элементе.
Кроме того, в случае поля, кажется,быть своего рода эффектом «удвоения», который происходит, если вы включаете Margin в ControlTemplate TemplateBinding.Если вы не используете шаблон для слепого поля, вы все равно можете переопределить поле, но его поведение изменится.
ШАГ 1
Определение базового стиля с помощью ControlTemplate.Убедитесь, что ваш ControlTemplate включает в себя TemplateBinding для всех свойств, которые вы можете настроить / переопределить для отдельных элементов.
<Style TargetType="Button">
<Setter Property="Foreground" Value="White"/>
<Setter Property="Background" Value="{StaticResource BaseButtonBG}"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="Padding" Value="0"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border
Background="{TemplateBinding Background}"
BorderThickness="{TemplateBinding BorderThickness}"
Padding="{TemplateBinding Padding}"
Margin="{TemplateBinding Margin}"
>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource BaseButtonBG_IsMouseOver}"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="{StaticResource BaseButtonBG_IsPressed}"/>
</Trigger>
</Style.Triggers>
</Style>
Я определил несколько ключей StaticResource для цветов своих свойств, чтобы я мог их поместитьвообще в другом месте для более чистой кожи.Вот эти ключи:
<SolidColorBrush x:Key="BaseButtonBG" Color="#5f636c"/>
<SolidColorBrush x:Key="BaseButtonBG_IsMouseOver" Color="#898C94"/>
<SolidColorBrush x:Key="BaseButtonBG_IsPressed" Color="#484B51"/>
ШАГ 2
Реализуйте действительную кнопку следующим образом:
<Button Content="New" />
И результат этого делаеткнопка, которая выглядит следующим образом:
ШАГ 3
Теперь, скажем, я хочу, чтобы все мои кнопкичтобы выглядеть таким раздавленным, кроме одного.Я хочу добавить вертикальный отступ, чтобы одна конкретная кнопка выглядела выше.Я мог бы изменить пример кнопки следующим образом:
<Button Content="New" Padding="0,30"/>
И результат:
В качестве альтернативы, вы можете реализовать кнопкупереопределите следующим образом, что дает вам возможность переопределить триггеры или другие специальные опции стиля.
<Button Content="New">
<Button.Style >
<Style TargetType="Button" BasedOn="{DynamicResource {x:Type Button}}">
<Setter Property="Padding" Value="0,30"/>
</Style>
</Button.Style>
</Button>
TADA!Мы установили одноразовую настройку стиля непосредственно на элемент ГДЕ ОНА!Нам не нужно было создавать стиль в словаре и ссылаться на него в этом одном случае.
Важные пункты
Для того, чтобы это сработало "Заполнение "ДОЛЖНО БЫТЬ определено в ControlTemplate с кодом TemplateBinding.Если вы этого не сделаете, Padding, непосредственно примененный к кнопке, просто полностью игнорируется.Опять же, я не уверен, почему это так, но это, кажется, волшебное исправление.
Дальнейшее чтение: Мне удалось выяснить это из некоторой полезной информации в этом блогеarticle:
явный-неявный-и-default-styles-in-wpf
Интересно, что в последней части этой статьи предлагается создать собственный элемент управления с вашим собственным значением по умолчаниюстиль и свойства, которые вы можете переопределить так же, как я сделал здесь.Это кажется мне немного излишним, но это может устранить странную проблему с ошибками, когда отступы и маржа ведут себя по-разному.Хотя еще не пробовал.