【问题标题】:Style Border in Buttons ControlTemplate with DataTrigger带有 DataTrigger 的按钮 ControlTemplate 中的样式边框
【发布时间】:2018-05-08 09:48:59
【问题描述】:

我有以下元素:

<Button Click="btn_Click" Name="aName">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Border Name="tmpBorder" Padding="10">
                <TextBlock Text="General" />
            </Border>
            <ControlTemplate.Triggers>
                <DataTrigger Binding="{Binding doIt}" Value="someString">
                    <Setter TargetName="tmpBorder" Property="Background" Value="Red" />
                </DataTrigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Button.Template>
</Button>

如果doIt 在后面的代码中设置为“someString”,我的目标是在ControlTemplate 中设置Border 元素的背景。 doIt 是后面代码中已定义类的公共成员,将由方法btn_Click 设置。

执行该方法并设置doIt 工作正常,但边框的背景不会变为红色。我错过了什么重要的东西吗?

【问题讨论】:

  • 我从您的问题标题中删除了强制的wpf 标签。请阅读here为什么。
  • @tg24 您是否有理由不使用数据触发器直接将样式应用于边框?
  • @dymanoid 谢谢。
  • @Daniele Sartori:你能给我举个例子来说明你的目标吗?我是 WPF 新手,有时真的很困惑。

标签: c# wpf xaml controltemplate datatrigger


【解决方案1】:

这应该可以工作

<Button Click="btn_Click" Name="aName">
      <Button.Template>
           <ControlTemplate TargetType="Button">
               <Border Padding="10" Background="{TemplateBinding Background}">
                        <TextBlock Text="General" />
               </Border>
               <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding doIt}" Value="someString">
                            <Setter  Property="Background" Value="Red" />
                        </DataTrigger>
               </ControlTemplate.Triggers>
           </ControlTemplate>
     </Button.Template>
</Button>

编辑:由于第一种方法不起作用,请直接尝试将样式应用于边框

如果您没有在控件模板中设置像背景这样的属性,则使用触发器进行的更改将不起作用

<Button Click="btn_Click" Name="aName">
      <Button.Template>
           <ControlTemplate TargetType="Button">
               <ControlTemplate.Resources>
                   <Style TargetType="{x:Type Border}">
                       <Setter Property="Background" Value="Transparent"/>
                       <Style.Triggers>
                           <DataTrigger Binding="{Binding doIt}" Value="someString">
                               <Setter Property="Background" Value="Red" />
                           </DataTrigger>
                       </Style.Triggers>
                   </Style>
               </ControlTemplate.Resources>
               <Border Padding="10" Background="{TemplateBinding Background}" Style>
                        <TextBlock Text="General" />
               </Border>
           </ControlTemplate>
     </Button.Template>
</Button>

【讨论】:

  • 不幸的是,这对我也不起作用。不是必须给 setter 一个 TargetName 属性吗?
  • 尝试给边框一个 x:Name 并在 setter 中使用目标名称
  • 就像我在上面显示的示例代码中所做的那样?我用 x:Name 和只有 Name 对它进行了测试。两种方式都行不通。
  • @tg24 添加了另一个解决方案
  • 再次感谢。似乎这背后的真正问题是我在后面代码中的属性,但我现在修复了它。我也测试了你的解决方案,它工作正常。所以我会接受它作为解决方案。
猜你喜欢
  • 2015-07-29
  • 2011-10-09
  • 2017-02-19
  • 2012-02-14
  • 2017-10-21
  • 2015-10-07
  • 2014-07-18
  • 2023-04-03
  • 2010-09-06
相关资源
最近更新 更多