2013-05-21 47 views
0

工作,我有一个样式按钮,如下:为什么这种风格是不是在WPF

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

+0

也许空模板中的ContentPresenter? – stijn

+0

@stijn我删除了它,但没有成功:( – mans

+0

没有什么可以绘画的东西了,给Button一个文本内容,它会显示内容对于设置背景,在边框内使用边框和ContentPresenter – Jatin

回答

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> 

这应该告诉你一些东西。

+0

它确实显示背景正确,但是包含'Template' setter意味着该按钮的chrome丢失了,从这个问题是不是很清楚这是OP所期望的! –

+0

它正在做我感兴趣的事情,但是如果我向按钮添加一些内容,它是左对齐的,我怎样才能让它居中对齐? – mans

+0

@mans:然后你可以像这样设置ContentPresenter.Horizo​​ntalAlignment =“Center”'但是如果你只需要'MouseOver'行为,你可能应该和Dan解。 – DHN

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是最简单的方法),并从中删除动画。

相关问题