Почему фон кнопки меняется?
Я новичок в WPF и даже не знаю, где искать ответ на этот вопрос. Этот XAML кажется мне очень простым:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<Button>
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
<Button.Content>Test</Button.Content>
</Button>
</Grid>
</Page>
Когда я наведите курсор мыши на кнопку, IsMouseOver
изменения в True
и триггер делает фон становится зеленым. На мгновение. Тогда это становится синим.
Еще лучше: если я присоединяю тот же сеттер к IsFocused
свойство, как только я сосредоточусь на кнопке, цвет фона пульсирует между зеленым и синим.
Что-то, где-то в кнопке (я предполагаю, что в какой-либо теме по умолчанию используется в Vista), это заставляет его вести себя таким образом. Я подозреваю, что есть еще одно свойство, которое должен установить триггер. Но что?
2 ответа
Вам нужно изменить Button
"s Template
а не его Style
, В шаблон встроено что-то под названием ButtonChrome, и именно это вызывает эффект раздражающего синего фокуса. Вот очень простой пересчет Button
контроль, взятый из предоставленных Простых Стилей:
<Style TargetType="{x:Type Button}">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="MinHeight" Value="23"/>
<Setter Property="MinWidth" Value="75"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border
x:Name="Border"
CornerRadius="2"
BorderThickness="1"
Background="#C0C0C0"
BorderBrush="#404040">
<ContentPresenter
Margin="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
RecognizesAccessKey="True"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsKeyboardFocused" Value="true">
<Setter TargetName="Border" Property="BorderBrush" Value="#202020" />
</Trigger>
<Trigger Property="IsDefaulted" Value="true">
<Setter TargetName="Border" Property="BorderBrush" Value="#202020" />
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter TargetName="Border" Property="Background" Value="#808080" />
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter TargetName="Border" Property="Background" Value="#E0E0E0" />
<Setter TargetName="Border" Property="BorderBrush" Value="#606060" />
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="Border" Property="Background" Value="#EEEEEE" />
<Setter TargetName="Border" Property="BorderBrush" Value="#AAAAAA" />
<Setter Property="Foreground" Value="#888888"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Вы можете видеть, что, повторно шаблонируя элемент управления, вы можете изменить его визуальное дерево. Визуальное дерево в этом шаблоне - не более чем Border
который содержит ContentPresenter
(чтобы вы могли видеть содержимое кнопки). Таким образом я эффективно удалил ButtonChrome из визуального дерева.
Ответ Чарли хорош. Я просто хочу дополнить объяснением того, что происходит, и комментарий не показался мне подходящим.
Причина, по которой он на мгновение был зеленым, а затем синим, заключается в том, что ControlTemplate
за Button
уже был IsMouseOver
Trigger
изменить фон.
Затем вы добавили еще один в вашем Style
, Это не заменяет существующий, потому что вы можете иметь несколько Trigger
с тем же свойством и значением, которые имеют очень разные Setter
и делать совершенно разные вещи.
Так что он пытался сделать то и другое, и сначала сделал зеленый.