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 渲染颜色与画笔和控件元素上的不透明度不一致的主要内容,如果未能解决你的问题,请参考以下文章

WPF实现渐变淡入淡出的动画效果

在WPF中使用另一个控件作为不透明蒙板?

WPF 字体中不可预测的不透明度行为

设置 WPF 标签内容 Alpha 透明度而不是整个控件的不透明度

wpf 控件四周扩散颜色

在 Loaded 事件中未完成渲染