为什么这种风格不适用于wpf

时间:2013-05-21 10:11:34

标签: wpf xaml

我的按钮样式如下:

<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代码有什么问题?

2 个答案:

答案 0 :(得分: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是最简单的方法)并从中删除动画。

答案 1 :(得分: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>

这应该会告诉你一些事情。