在我的WPF应用程序中,我必须根据用户条件继续更新TextBlock背景。 TextBlock样式在App.xaml中定义。如果背景太暗(绿色/蓝色),我想将前景设置为白色,否则为黑色。我怎样才能做到这一点?我探讨了以下两个选项:
通过DataTriggers: 在App.xaml中:
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="14"/>
<Setter Property="FontStyle" Value="Normal"/>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Background,PresentationTraceSources.TraceLevel=High}" Value="White">
<Setter Property="Foreground" Value="Maroon"/>
</DataTrigger>
</Style.Triggers>
</Style>
这似乎不起作用。我从未在textblock的foreground属性中看到更新。在调试时,我看到绑定的以下内容: &LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT; &LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT; &LT;&LT;&LT;&LT;&LT;&LT;&LT;
System.Windows.Data警告:72:RelativeSource.Self找到TextBlock(hash = 61003640) System.Windows.Data警告:78:BindingExpression(hash = 6398298):使用根项目TextBlock激活(hash = 61003640) System.Windows.Data警告:107:BindingExpression(hash = 6398298):在0级使用TextBlock.Background的缓存访问器:DependencyProperty(Background) System.Windows.Data警告:104:BindingExpression(hash = 6398298):使用访问者DependencyProperty(背景)替换0级的项目与TextBlock(hash = 61003640) System.Windows.Data警告:101:BindingExpression(hash = 6398298):使用DependencyProperty(背景)从TextBlock(hash = 61003640)获取级别0的GetValue:SolidColorBrush(hash = 58614288) System.Windows.Data警告:80:BindingExpression(hash = 6398298):TransferValue - 得到原始值SolidColorBrush(hash = 58614288) System.Windows.Data警告:89:BindingExpression(hash = 6398298):TransferValue - 使用最终值SolidColorBrush(hash = 58614288) &LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT; &LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT; &LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;&LT;
什么是“SolidColorBrush(hash = 58614288)”?它是Hex颜色代码还是SolidColorBrush类型对象的代码?
我已经查看了以下主题:Change TextBlock foreground color based on the background。它对我的情况没有帮助。 任何帮助都非常感谢。
谢谢,
RDV
关于我的申请的更多信息:
当我的应用程序启动时,我的TextBlocks具有默认的背景颜色。所有Textblock样式都存储在ResourceDictionary中,该ResourceDictionary存储在不同的解决方案中。我在我的应用程序的App.xaml中只有一个ResourceDictionary:
<Application x:Class="MySolution"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/ResourcesSolution;component/Resources/GenericStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
FontWeight,FontStyle,甚至Foreground等都可以从这里正确选取。但这些都是静态属性。在某些用户操作中,我在运行时更改TextBlock的背景颜色,但有时会使文本无法读取,如绿色背景上的黑色文本。当背景颜色发生变化时,我也可以绑定前景色,但在这种情况下,我必须在所有视图中进行绑定。相反,我希望有一个全局风格来处理这项工作,这样即使我忘记绑定前景色,也会自动选择正确的颜色。
我有一个很大的应用程序,性能是一个主要问题。这就是为什么我对使用转换器犹豫不决并且正在寻找一些基于xaml的解决方案,因为这只是一个基于条件的问题。
答案 0 :(得分:1)
我通过在TextBlock控件上设置Background来测试我的代码,我可以看到以下样式触发器在声明为全局样式表时按预期工作:
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="12"/>
<Setter Property="FontStyle" Value="Italic"/>
<Style.Triggers>
<Trigger Property="Background" Value="White">
<Setter Property="Foreground" Value="Aqua"/>
</Trigger>
<Trigger Property="Background.Color" Value="Transparent">
<Setter Property="Foreground" Value="BlueViolet"/>
</Trigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Background}" Value="White">
<Setter Property="Foreground" Value="Maroon"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Background.Color}" Value="#FF008000">
<Setter Property="Foreground" Value="Blue"/>
</DataTrigger>
</Style.Triggers>
</Style>
但是,我最初没有注意到这种行为,因为我认为Button的内容(由TextBlock内部表示)也应该使用TextBlock的样式触发器(它正在拾取以全局样式定义的TextBlock的FontSize和FontStyle)。 / p>
我认为这与ContentPresenter问题有关,应该在另一个主题中解决。
谢谢,
RDV