0

我的按钮样式如下:

<Style TargetType="Button" x:Key="BlackButton">
    <Setter Property="Background" Value="Black"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="red" />
                    </Trigger>
                </ControlTemplate.Triggers>
                <ContentPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

和一个按钮,其定义如下:

<Button Canvas.Left="19" Canvas.Top="520" Height="34" Width="107" 
        Style="{StaticResource BlackButton}" />

但是当我运行应用程序时,我看不到按钮。它的背景设置为无。

如果我更改样式如下:

<Style TargetType="Button" x:Key="BlackButton">
    <Setter Property="Background" Value="Black"/>         
</Style>

(删除模板)然后显示按钮,但其背景没有改变。

这个 xaml 代码有什么问题?

4

2 回答 2

1

您已覆盖控件的模板以设置MouseOver触发器。这意味着您的控件模板是空的 - 因此没有为您的按钮绘制任何内容。

您可以通过将触发器移动到样式本身来解决此问题,如下所示:

<Style TargetType="Button" x:Key="BlackButton">
  <Setter Property="Background" Value="Black"/>
  <Style.Triggers>

        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="red" />
        </Trigger>
  </Style.Triggers>       
</Style>

但是,您现在可能遇到的是按钮的内置MouseOver动画将覆盖您的红色背景。您会看到一闪而过的红色,然后过渡到默认的 Windows 颜色。彻底解决此问题的一种方法是获取默认Button模板的完整副本(使用 Expression Blend 是执行此操作的最简单方法)并从中删除动画。

于 2013-05-21T10:23:45.147 回答
0

那么你ControlTemplate只是空的,虽然你有一个ControlPresenter。但是由于它的Content属性没有设置,所以它也是空的。要拥有一个Background,您必须添加一个Border.

<Style TargetType="Button" x:Key="BlackButton">
    <Setter Property="Background" Value="Black"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="red" />
                    </Trigger>
                </ControlTemplate.Triggers>
                <Border Background="{TemplateBinding Background}">
                    <ContentPresenter Content="{TemplateBinding Content}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这应该向您展示一些东西。

于 2013-05-21T10:17:48.320 回答