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

时间:2015-05-23 09:14:16

标签: wpf xaml opacity converters

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

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

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

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

我们也不能直接在Border上设置不透明度,因为它的所有子元素也具有相同的不透明度。

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

3 个答案:

答案 0 :(得分:1)

有点晚了,但为了别人的缘故......

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

这是StackOverflow上该页面的链接,我在这里为动态和静态资源执行此操作...

Post 33816511: How to create a DynamicResourceBinding