WPF: изменить цвет фона рамки левой кнопкой мыши вниз - PullRequest
3 голосов
/ 05 февраля 2010

Ниже представлен стиль, который я использую для кнопок в моем приложении. Теперь я пытаюсь изменить цвет фона элемента 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>

Ответы [ 2 ]

17 голосов
/ 05 февраля 2010

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

            <ControlTemplate.Triggers>
                <Trigger Property="IsPressed" Value="True">
                    <Setter Property="Background" TargetName="Background" Value="Red"/>
                </Trigger>
            </ControlTemplate.Triggers>
4 голосов
/ 05 февраля 2010

Вам нужен EventTrigger

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

<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, как указано в другом ответе.

...