WPF 渲染颜色与画笔和控件元素上的不透明度不一致
Posted
技术标签:
【中文标题】WPF 渲染颜色与画笔和控件元素上的不透明度不一致【英文标题】:WPF Rendered Color inconsistency with Opacity on Brush and Control Elements 【发布时间】:2015-03-26 12:56:24 【问题描述】:考虑以下xaml。
<Window x:Class="PlayTabControl.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<Color x:Key="HintColor" A="255" R="0" G="0" B="0"></Color>
<SolidColorBrush x:Key="HintColorBrush" Color="DynamicResource HintColor" Opacity="0.26"/>
</ResourceDictionary>
</Window.Resources>
<StackPanel Background="White">
<TextBlock FontSize="28" FontWeight="ExtraBlack"
Text="Hello World, #42000000"
Foreground="#42000000"
HorizontalAlignment="Center"/>
<TextBlock FontSize="28" FontWeight="ExtraBlack"
Foreground="StaticResource HintColorBrush"
Text="Hello World, HintColorBrush @ 0.26"
HorizontalAlignment="Center"/>
<TextBlock FontSize="28" FontWeight="ExtraBlack"
Text="Hello World, #68000000"
Foreground="#68000000"
HorizontalAlignment="Center"/>
<TextBlock FontSize="28" FontWeight="ExtraBlack"
Foreground="Black"
Opacity="0.26"
Text="Hello World, Black TB@0.26"
HorizontalAlignment="Center"/>
<TextBlock FontSize="28" FontWeight="ExtraBlack"
Foreground="#FFbdbdbd"
Text="Hello World, #FFbdbdbd"
HorizontalAlignment="Center"/>
</StackPanel>
</Window>
它产生以下结果:
从中可以看出 Line1 和 Line2 的颜色不同。第 3 行在视觉上是正确的,但在颜色输入方面数字不正确。 这是对每一行 Textblock 所做的操作。
-
#42000000 的硬编码前景色。这大约是 26% 的不透明度。结果:不正确
不透明度为 0.26 的画笔资源,颜色设置为黑色有效。结果:不正确
产生相同感知输出的更正数字。理论上是 40.6% 的不透明度。
使用文本块的不透明度 0.26。结果:正确
#FFbdbdbd 的硬编码颜色,不涉及透明度。结果:正确
我的问题是:wpf 以不同的方式呈现什么/为什么?当设计师的示例/屏幕截图涉及透明度时,这使得可靠地进行颜色样式设置变得困难。
请注意,出于好奇,我也在 Windows 商店应用中完成了此操作。结果是我所期望的,除了 Line3 之外,所有颜色都相同,它现在变得更暗,因为它更不透明。
【问题讨论】:
你会想要研究 RGBa 和 Opacity 之间的区别 @ChrisW。你想说什么?如果您将不同的画笔和不透明度应用于文本以外的其他内容(例如线条的笔划),您不会注意到这些差异。 @Clemens 是的,对此很抱歉,很明显,如果有一个具体点,我会提供一个具体的答案。虽然我认为我对罪魁祸首有一个好主意,但当我有更多空闲时间时,我将不得不回过头来,而不是仅仅留下模糊的方向性反应。干杯 @ChrisW。好吧,我很好奇…… @Clemens 我知道你是朋友,我也是:D 【参考方案1】:如果有人也偶然发现了这个问题,似乎将TextOptions.TextFormattingMode 设置为Display 似乎可以解决问题(您可以在窗口级别设置它,这样它会影响所有内容)。不过,这确实会稍微改变文本渲染布局,因此请考虑到这一点。请参阅this 了解更多信息,了解两者之间的区别。
【讨论】:
以上是关于WPF 渲染颜色与画笔和控件元素上的不透明度不一致的主要内容,如果未能解决你的问题,请参考以下文章