在我的 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 的前景属性中看到更新。在调试时,我看到以下绑定:<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<
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):将级别 0 的项目替换为 TextBlock ( hash=61003640),使用访问器 DependencyProperty(Background) System.Windows.Data 警告:101:BindingExpression (hash=6398298): GetValue at level 0 from TextBlock (hash=61003640) using DependencyProperty(Background): 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) <<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <
什么是“SolidColorBrush (hash=58614288)”?SolidColorBrush 类型的对象是十六进制颜色代码还是 hascode?
- 使用 IValueConverter:没有尝试过,因为我不想将一个值转换为另一个值,而是根据其他一些属性更改来更改 UIElement 的属性。此外,由于几乎所有 UIElements 都在内部使用 TextBlock 来显示数据,因此转换器不会对性能造成影响吗?
我已经看过以下线程: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 的解决方案,因为这只是一个基于条件的问题。