【发布时间】:2016-12-31 13:11:02
【问题描述】:
我正在为我的 WPF 应用程序使用自定义 TextBox 控件,该控件在 Generics.xaml 文件中设置了默认样式。我在文件中设置的Template包括以下Setter和Triggers:
<Setter Property="Background" Value="Blue" />
<Trigger Property="IsFocused" Value="True">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderBrush" Value="Black"/>
</Trigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=IsEnabled, RelativeSource={RelativeSource Self}}" Value="True" />
<Condition Binding="{Binding Path=IsFocused, RelativeSource={RelativeSource Self}}" Value="False" />
<Condition Binding="{Binding Path=(Validation.HasError), RelativeSource={RelativeSource Self}}" Value="False" />
<Condition Binding="{Binding Path=Text, RelativeSource={RelativeSource Self}, Converter={StaticResource IsEmptyStringConverter}}" Value="False" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Background" Value="Green" TargetName="Border" />
<Setter Property="Foreground" Value="White"/>
</MultiDataTrigger.Setters>
</MultiDataTrigger>
如果我没有为 Background 属性设置本地值,此代码将按预期工作。当聚焦时,我的背景变成黄色,当没有聚焦并且没有验证错误时,它变成绿色。
但是,如果我为 Background 属性设置 Local Value,就像在下面的代码 sn-p 中一样,当触发其中一个触发器时,Background 行为会非常奇怪。
<custom:TextBox Background="Orange" />
- 当 IsFocued 触发器被触发时,背景保持橙色。我认为这是由于 WPF 的 Dependency Property Setting Precedence 导致的,它偏爱本地值而不是样式触发器中设置的值。是的,随着 BorderBrush 和 Foreground 的变化,Trigger 肯定会被触发。
- 当第二个触发器(MultiDataTrigger for Validation)被触发时,背景变为绿色。本地值被忽略。
据我所知,这是不一致的。为什么第一个触发器使用我的本地值,而第二个触发器坚持它的背景设置器?这两个触发器之间是否有不同的优先级?
【问题讨论】:
-
背景设置器的 isFocused 触发器中缺少 TargetName="Border",因此您的 isfocused 和多数据触发器很可能针对不同的背景
-
谢谢!当我添加属性时,选中时背景变为黄色。这是否意味着当我针对 Setter 中的特定控件时,该值不会被本地值覆盖?
-
基本上可以这样想,当您设置本地值时,您的文本框控件只是子控件的集合,您在定位“边框”时设置基本控件的属性,您指定一个属性覆盖基本控件的子控件
标签: c# .net wpf wpf-controls wpf-style