您可以对系统定义的画笔应用不透明度吗?

Posted

技术标签:

【中文标题】您可以对系统定义的画笔应用不透明度吗?【英文标题】:Can you apply an opacity to a system-defined brush? 【发布时间】:2015-08-05 07:37:58 【问题描述】:

我知道 WPF 画笔类有一个 Opacity 属性。我们需要使用系统定义的画笔,但不透明度只有一半。我们想做这样的事情(这显然是假代码)......

<Border Background="DynamicResource x:Static SystemColors.HighlightBrushKey, Opacity=0.5" />

我们当然不能直接更改系统定义画笔的不透明度,因为那样会在使用它的任何地方搞砸。

我们想要做的是以某种方式定义一个转换器,我们使用一个画笔并返回它的副本并更改不透明度,但由于这不是绑定,我们不知道在哪里/如何应用转换器。另外,如果它是动态资源,我们需要确保它跟踪更改。

我们也不能简单地直接在边框上设置不透明度,因为它的所有子项也具有相同的降低不透明度。

我们当前的解决方法不是将内容直接放在边框中,而是将边框及其内容作为兄弟姐妹放在网格中,然后在边框上设置不透明度。由于内容现在位于边框顶部而不是边框​​内,因此不受不透明度的影响。这只是意味着我们在可视化树中添加了额外的东西,这很烦人,但它确实有效。如果我们可以直接在 XAML 中调整(副本)系统画笔的不透明度会更好。

【问题讨论】:

【参考方案1】:

也许您可以尝试根据系统颜色创建一个新画笔,而不是直接使用系统画笔,如下所示:

<Border>
    <Border.Background>
        <SolidColorBrush 
            Color="DynamicResource x:Static SystemColors.HighlightColorKey"
            Opacity="0.5" />
    </Border.Background>
</Border>

【讨论】:

【参考方案2】:

嗯,我想我找到了!感谢我所做的其他工作,我提出了一个 DynamicResourceBinding 概念(StaticResourceBinding 也是!),您可以使用转换器以任何您想要的方式转换画笔。

这是 *** 上该页面的链接,我对动态和静态资源都执行此操作...

Post 33816511: How to create a DynamicResourceBinding

【讨论】:

【参考方案3】:

有点晚了,不过看在别人的份上……

您可以创建具有新不透明度的衍生纯色画笔。为此,您只需从用作绑定源的原始画笔中借用颜色,然后设置新的不透明度。

<SolidColorBrush Color="Binding Color, Source=StaticResource blue-light" Opacity="0.5" />

【讨论】:

以上是关于您可以对系统定义的画笔应用不透明度吗?的主要内容,如果未能解决你的问题,请参考以下文章

WPF 渲染颜色与画笔和控件元素上的不透明度不一致

我可以在 Android 谷歌地图 API 中设置折线不透明度吗

如何避免在 SkiaSharp 中“叠加”不透明度

如何在(libgdx)阶段检测对图像透明区域的触摸?

PS如何使用自定义画笔

设置烤面包机不透明度?