【发布时间】:2020-09-10 07:19:38
【问题描述】:
我有一个项目列表,当一个项目变得“完整”时,它的不透明度设置为 0.4 以使其消失。此外,当一个项目完成时,该图标会得到一个橙黄色的完成覆盖。
这个标记类似于
<Grid Opacity="{x:Bind IsCompleted, Converter={StaticResource BooleanNumberConverter}, ConverterParameter=0.4|1}">
[...]
<Canvas>
<Image />
<Rectangle
Visibility="{x:Bind IsCompleted, Converter={StaticResource BooleanVisibilityConverter}}"
Canvas.Top="0" Canvas.Left="0"
Width="48"
StrokeThickness="2"
Opacity="1"
Height="48" Stroke="#ffC19954" />
<Polygon
Visibility="{x:Bind IsCompleted, Converter={StaticResource BooleanVisibilityConverter}}"
Opacity="1"
Canvas.Top="23" Canvas.Left="23" Points="0,25 25,25, 25,0" Fill="#ffC19954" />
</Canvas>
[...]
</Grid>
我遇到的问题是,不透明度似乎是单独应用于每个后代的,因此橙色完成三角形在图标顶部显示为半透明,您可以在下方看到图标。您还可以在三角形与边框重叠的位置看到这一点。
相反,理想的行为是三角形应该是完全不透明的,而网格作为一个整体应该是半透明的,就像它在 CSS 中的行为一样:
不透明度适用于整个元素,包括其内容,即使该值不被子元素继承。因此,元素及其子元素相对于元素的背景都具有相同的不透明度,即使它们彼此之间具有不同的不透明度。
应该是这样的
(注意白色图标如何通过橙色三角形不可见)
有没有办法改变不透明度的合成和渲染方式来实现这一点?很快应用的背景就会变得稍微透明,所以我需要一个同样适用的解决方案。
【问题讨论】:
-
也许您可以尝试从第二张图像中获取透明度为 0.4 的多边形颜色的 RGB,然后将新的 RGB 应用于多边形的颜色。在这种情况下,将 Polygon 覆盖在 Grid 上并将 Opacity 保持为 1。
-
如果应用程序的背景是半透明的,这会起作用吗?
-
您是如何将应用程序的背景设置为半透明的?用亚克力?不会影响多边形的不透明度,你可以试试看能不能达到你想要的效果。
-
我想过,但是将图标的那部分移到网格之外并设置不同的纯色对于我从中得到的东西来说太麻烦了——只是不值得。希望有一些不同的合成/不透明级联模式我可以选择
-
您可以查看Opacity属性的Remarks部分,它提到如果Opacity=0.5的对象包含在Opacity=0.5的Canvas中,则渲染的有效Opacity值为0.25 .所以即使你将Polygon的Opacity设置为1,渲染的有效Opacity值仍然等于Grid的Opacity。或者您可以使用 Binding 设置每个想要半透明的子元素的不透明度,而不是直接设置父元素的不透明度。