【问题标题】:WPF Button's Style Being Inappropriately Overridden by Command BindingWPF 按钮的样式被命令绑定不恰当地覆盖
【发布时间】:2015-05-28 19:32:42
【问题描述】:

简单的问题,真的。我用一些简单的绑定和样式触发器定义了以下按钮:

<Button HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderBrush="Transparent" BorderThickness="0" Command="{Binding AcceptValueInputCommand}">
  <Button.Style>
    <Style TargetType="{x:Type Button}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding ValueInputEnabled}" Value="True">
          <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
        <DataTrigger Binding="{Binding IsPredefined}" Value="True">
          <Setter Property="Background" Value="Red" />
          <Setter Property="Foreground" Value="Black" />
        </DataTrigger>
      </Style.Triggers>
      <Setter Property="Visibility" Value="Visible"/>
      <Setter Property="Background" Value="White" />
      <Setter Property="Foreground" Value="Black" />
    </Style>
  </Button.Style>
  <Viewbox>
    <TextBlock Text="{Binding Value}" />
  </Viewbox>
</Button>

我遇到的问题是我在“IsPredefined”上的触发器没有将按钮的背景设置为红色。前景 确实 被正确设置为黑色(尽管我不知道为什么它没有从样式之外的设置器中拾取它)。我认为问题与按钮上的命令绑定有关,因为如果我将绑定注释掉,按钮突然变红了! (注意,在“IsPredefined”评估为真的所有情况下,命令的 CanExecute() 应该评估为假)。有什么想法吗?

(编辑为在 IsPredefined 触发器中添加黑色前景)。

【问题讨论】:

  • 尝试将按钮的 OveridesDefaultStyle 属性设置为 true。
  • @mgarant 刚试过,然后我所有按钮的内容都消失了。仅供参考,我只是将前景的设置器放在与背景相同的触发器中,然后 that 被设置...

标签: c# wpf


【解决方案1】:

这是因为当 CanExecute 返回 false 时,按钮将被禁用,样式触发器将被按钮的默认控件模板中定义的控件模板触发器覆盖,该控件模板触发器将背景设置为灰色。

如果您想更改它,您必须覆盖按钮的默认模板并摆脱负责将其设置为灰色的触发器。此示例应该可以工作:

<Button HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderBrush="Transparent" BorderThickness="0" Command="{Binding AcceptValueInputCommand}">
    <Button.Template>
        <ControlTemplate TargetType="ButtonBase">
            <Border BorderThickness="{TemplateBinding Border.BorderThickness}"
                    BorderBrush="{TemplateBinding Border.BorderBrush}"
                    Background="{TemplateBinding Panel.Background}"
                    Name="border"
                    SnapsToDevicePixels="True">
                <ContentPresenter RecognizesAccessKey="True"
                                    Content="{TemplateBinding ContentControl.Content}"
                                    ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
                                    ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}"
                                    Name="contentPresenter"
                                    Margin="{TemplateBinding Control.Padding}"
                                    HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                                    VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
                                    SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"
                                    Focusable="False" />
            </Border>
        </ControlTemplate>
    </Button.Template>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsEnable}" Value="True">
                    <Setter Property="Background" Value="Red" />
                    <Setter Property="Foreground" Value="Black" />
                </DataTrigger>
            </Style.Triggers>
            <Setter Property="Visibility" Value="Visible"/>
            <Setter Property="Background" Value="White" />
            <Setter Property="Foreground" Value="Black" />
        </Style>
    </Button.Style>
    <Viewbox>
        <TextBlock Text="{Binding Value}" />
    </Viewbox>
</Button>

【讨论】:

  • 谢谢!那效果很好。现在我必须研究它以了解 为什么 它有效。每当我开始认为我对 WPF 有点了解时,就会出现类似的情况......
猜你喜欢
  • 2012-12-20
  • 1970-01-01
  • 2013-09-16
  • 2011-01-06
  • 2015-06-07
  • 1970-01-01
  • 2018-11-20
  • 2023-03-14
  • 2016-01-14
相关资源
最近更新 更多