按钮内容并不总是显示

时间:2016-10-19 10:59:51

标签: c# .net wpf xaml

基于下面的xaml,是否有人知道为什么如果我创建2个(或更多)按钮(具有隐式样式),其中只有1个实际显示内容,但都显示蓝色边框。

<Style TargetType="Button">

  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Button">
        <Border BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="1">
          <ContentPresenter Content="{TemplateBinding Content}"/>
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>

  <Setter Property="BorderBrush" Value="Blue"/>

  <Setter Property="Content">
    <Setter.Value>
      <Grid Background="Firebrick"/>
    </Setter.Value>
  </Setter>

</Style>

检查后面的代码,所有3个按钮都具有完全相同的内容,但它只显示在其中一个上

if (a.Style == b.Style && a.Style == c.Style)
{
    if (a.Content == b.Content && a.Content == c.Content)
    {
        // comes in here!
    }
}

enter image description here

2 个答案:

答案 0 :(得分:1)

Clemens和ASh提到的问题是内容中的网格不能超过1个父级。

解决方法是使用DataTemplate并将元素的ContentTemplate设置为DataTemplate(如下面的主题所述)。

Set a Button's content in style

答案 1 :(得分:0)

我已经通过按钮图像遇到了这个问题。这与您定义Content属性而不是Template属性的样式相关联。通过设置Content属性,您不需要定义对某些内容的引用,也不要求WPF为每个项创建一个新对象,这意味着只有使用该样式呈现的最后一个元素才会设置为Content

所以你想要做的是,如果你打算为每个按钮设置一个内容,设置ContentTemplate属性。如果您实际上只想更改Template的方面,请设置Button属性。

例如使用Template属性:

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="Button">
            <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1">
                <ContentPresenter Content="{TemplateBinding Content}" />
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>

<Setter Property="BorderBrush" Value="Blue" />

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type Button}">
            <Grid Background="Firebrick" />
        </ControlTemplate>
    </Setter.Value>
</Setter>