如何通过按钮中的触发器更改按钮颜色?

时间:2018-03-29 15:53:32

标签: c# wpf xaml triggers

这个触发器有什么问题?我在这里找到了它:http://www.wpf-tutorial.com/styles/trigger-datatrigger-event-trigger/并且我在SO

上看到了类似的设置
    <Button x:Name="ColorPickerButton" Background="{Binding SelectedColor}">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="Red"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

我试图打破我的意大利面条XAML并使其更具可读性。这是我的旧实现,它确实有效。我不喜欢它,因为它覆盖了按钮内容并覆盖了边框,这似乎是不必要的。还有它的庞大

    <Button x:Name="ColorPickerButton" Background="{Binding SelectedColor}">
        <Button.Resources>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Border x:Name="Bd"
                                    BorderBrush="{TemplateBinding BorderBrush}"
                                    BorderThickness="{TemplateBinding BorderThickness}"
                                    Background="{TemplateBinding Background}"
                                    Padding="{TemplateBinding Padding}"
                                    SnapsToDevicePixels="true">
                                <GridViewRowPresenter/>
                            </Border>
                            <ControlTemplate.Triggers>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="IsMouseOver" Value="True"/>
                                    </MultiTrigger.Conditions>
                                    <Setter Property="BorderBrush" Value="{StaticResource ColorPickerButton.MouseOver.Border}"/>
                                </MultiTrigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Button.Resources>
    </Button>

1 个答案:

答案 0 :(得分:0)

您的触发器不起作用,因为按钮的默认模板有自己的触发器,可在设置 IsMouseOver 属性时更改根边框的背景画笔。这意味着:只要鼠标位于按钮顶部,按钮控件的背景 - 属性将被其模板忽略。

检查按钮默认样式的最简单方法是:右键单击visual studio wpf designer中的按钮。点击&#39; 修改模板&#39; - &GT; &#39; 编辑副本&#39;并选择一个位置。 将在指定位置创建默认样式的副本。你会看到这样的触发器:

  <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>

在设计师创建的样式定义之上,它还创建了样式中使用的画笔:

     <SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
     <SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>

您可以更改这些画笔或上面设置器的 Value 属性,以便在鼠标结束时更改背景。 或者您像在旧实现中一样创建自己的模板。