Почему фон кнопки меняется?

Я новичок в 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 уже был IsMouseOverTrigger изменить фон.

Затем вы добавили еще один в вашем Style, Это не заменяет существующий, потому что вы можете иметь несколько Trigger с тем же свойством и значением, которые имеют очень разные Setter и делать совершенно разные вещи.

Так что он пытался сделать то и другое, и сначала сделал зеленый.

Другие вопросы по тегам