не меняется фон у кнопки при наведении C#

345
11 февраля 2017, 05:47
<Button x:Name="addRoom" Content="" Margin="0,0,0,-1" Click="add_room_click" Height="22" Width="22" VerticalAlignment="Bottom">
     <Button.Style>
          <Style TargetType="Button" >
              <Style.Triggers>
                   <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="Green" />
                   </Trigger>
                   <Trigger Property="IsPressed" Value="True">
                          Setter Property="BorderBrush" Value="#FFCDCDCD" />
                   </Trigger>
               </Style.Triggers>
          </Style>
      </Button.Style>
      <Button.Background>
           <ImageBrush ImageSource="Resources/plus_icon.png"/>
      </Button.Background>
</Button>

не срабатывает ни один из тригеров.. цвет кнопка при наведении цвет меняет, но она меняет на другой, какой был задан по умолчанию, как я понял. Меняет она его не смотря на изображение, она просто это изображение убирает и ставит свой цвет.

Answer 1

Проблема в том, как задан стиль кнопки. Его можно посмотреть в Visual Studio 2015, нажав на правую кнопку мыши в дизайнере и выбрав «Edit Template...». Вы увидите, что для показа другого цвета при наведении мыши используется триггер внутри шаблона, который выставляет фиксированный цвет, не зависящий от Background:

<Style x:Key="FocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
<SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
<SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
<SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
<SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
<SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
<SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
<SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
<SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
    <Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
    <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Padding" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                    <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsDefaulted" Value="true">
                        <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="true">
                        <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
                        <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Обратите внимание на эту часть:

<Trigger Property="IsMouseOver" Value="true">
    <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
    <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
</Trigger>

Это значит, что для смены цвета на IsMouseOver имеет смысл подменить Button.MouseOver.Background:

<SolidColorBrush x:Key="Button.MouseOver.Background" Color="Green"/>

К сожалению, это значит, что вам придётся тащить с собой весь стиль, т. к. Button.MouseOver.Background подключается как StaticResource.

Я отредактировал ответ, старый ответ оказался неправильным.

READ ALSO
Оптимизация работы с SQLite

Оптимизация работы с SQLite

Имеется код (он рабочий), но хотел бы узнать, можно его как-то упростить? Особенно интересует, можно как-нибудь уменьшить кол-во строк? Просто...

289
ObservableCollection и абстрактный лист

ObservableCollection и абстрактный лист

Допустим есть какой либо абстрактный класс, который имеет в себе основную реализациюНу как принято во многих статьях или книгах - AbstractBox

262
The iOS Designer requires an active connection to the Mac server

The iOS Designer requires an active connection to the Mac server

Сложилась непростая ситуацияВдруг понадобилось написать небольшое приложение под iOS, но не тут-то было

477
Статический метод расширения

Статический метод расширения

У нас есть статические методы:

248