WPF: изменить цвет фона границы при нажатии левой кнопки мыши

Ниже приведен стиль, который я использую для кнопок в своем приложении. Теперь я пытаюсь изменить цвет фона элемента Border с именем "Background", когда пользователь нажимает кнопку левой кнопкой мыши.

Как мне это сделать?

<Style TargetType="{x:Type Button}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border BorderBrush="#6e6964" BorderThickness="1" CornerRadius="1" Margin="{TemplateBinding Margin}" SnapsToDevicePixels="True">
                    <Border BorderBrush="White" BorderThickness="1" CornerRadius="1" SnapsToDevicePixels="True">
                        <Border Padding="12,4,12,4" SnapsToDevicePixels="True" Name="Background">
                            <Border.Background>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                    <GradientStop Color="White" Offset="0"/>
                                    <GradientStop Color="#f1f1f1" Offset="1"/>
                                </LinearGradientBrush>
                            </Border.Background>
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>
                    </Border>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" TargetName="Background">
                            <Setter.Value>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                    <GradientStop Offset="0" Color="#edf8fb"/>
                                    <GradientStop Offset="1" Color="#e2edf0"/>
                                </LinearGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

person Deniz Dogan    schedule 05.02.2010    source источник
comment
Для ответа требуется дополнительная информация: вы меняете цвет на другой «предопределенный цвет» или хотите открыть диалоговое окно, позволяющее пользователю выбрать свой собственный цвет?   -  person Scott    schedule 05.02.2010
comment
Нет, я просто хочу изменить его на любой цвет. Если так будет проще, скажем, я хочу Red. :)   -  person Deniz Dogan    schedule 05.02.2010


Ответы (2)


Вам просто нужен следующий триггер property:

<ControlTemplate.Triggers>
    <Trigger Property="IsPressed" Value="True">
        <Setter Property="Background" TargetName="Background" Value="Red"/>
    </Trigger>
</ControlTemplate.Triggers>
person Rob Fonseca-Ensor    schedule 05.02.2010
comment
Большое спасибо! Я искал такую ​​недвижимость, но не мог ее найти! - person Deniz Dogan; 05.02.2010
comment
@DenizDogan Не могли бы вы рассказать об аналогичном свойстве для поля со списком, IsPressed выдает ошибку времени компиляции. - person Narendra; 17.07.2013
comment
используйте здесь Button.IsPressed, так как мы используем шаблон управления - person Mathee; 03.05.2016

Вам нужен EventTrigger

Дайте одному или обоим GradientStops вашей границы имя (не те, что в вашем триггере):

<GradientStop Color="#f1f1f1" Offset="1" x:Name="Stop2" />

И добавьте следующий EventTrigger в свой ControlTemplate.Triggers:

<EventTrigger RoutedEvent="Button.Click">
  <EventTrigger.Actions>
    <BeginStoryboard>
      <Storyboard>
        <ColorAnimation Storyboard.TargetName="Stop2" Storyboard.TargetProperty="Color" To="Red" Duration="0" />
      </Storyboard>
    </BeginStoryboard>
  </EventTrigger.Actions>
</EventTrigger>

Если вы хотите изменить обе остановки градиента, обязательно дайте им имя и выполните ColorAnimation для каждой из них по отдельности (я думаю, вы можете сделать их обе в одной и той же раскадровке).

Надеюсь, поможет!

Изменить: это сделает изменение постоянным в событии Click (я тестировал с VS 2010 Beta 2 и Button.MouseLeftButtonDown не работает, но Button.Click работает только для левой кнопки мыши, но не для правой кнопки мыши). Если вы хотите, чтобы изменение происходило только тогда, когда мышь нажата... но возвращаетесь к нормальному значению, когда кнопка больше не нажата... тогда вам следует использовать триггер свойства IsPressed, как указано в другом ответе.

person Scott    schedule 05.02.2010