【问题标题】:Setting Opacity on parent <Grid /> makes children indepedently transparent在父 <Grid /> 上设置 Opacity 使子级独立透明
【发布时间】: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 设置每个想要半透明的子元素的不透明度,而不是直接设置父元素的不透明度。

标签: windows uwp uwp-xaml


【解决方案1】:

你可以通过简单地逆向来解决这个问题。

在项目上方放置一个遮罩网格,为网格设置纯色,将其设置为0不透明度,当您希望后面的内容淡出时,只需增加其不透明度即可。

<Grid Name="BaseGrid">
<Canvas>
        <Image />
    [...]
</Canvas>

<Grid Name="MaskGrid" Background="Gainsboro" Opacity="0.2"/>

</Grid>

【讨论】:

  • 有趣且新颖的解决方案,但我认为这不会那么好,因为如果我的应用程序的背景是透明的(即将成为),那么我认为它会更棘手在该叠加层上设置正确的不透明度...
  • 如果你使用亚克力,你也可以将遮罩网格的背景设置为亚克力。
  • 正如我在这个模型 i.imgur.com/2965R8F.png 中演示的那样,当应用程序的背景透明时,应用彩色覆盖“遮罩”来“淡出”我的内容不起作用,因为遮罩中的颜色将添加到半透明应用背景
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2017-09-01
  • 2014-10-27
  • 2013-02-21
相关资源
最近更新 更多