首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UWP透明LinearGradientBrush

UWP透明LinearGradientBrush
EN

Stack Overflow用户
提问于 2016-02-01 15:58:06
回答 1查看 4.3K关注 0票数 4

我的c# UWP应用程序有问题。

代码语言:javascript
复制
<Grid VerticalAlignment="Bottom" Height="40" Grid.Row="3" Margin="0,0,0,-1">
  <Grid.Background>
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
        <GradientStop Color="#00000000" Offset="0"/>
        <GradientStop Color="{StaticResource stdBackgroundColor}" Offset="1"/>
    </LinearGradientBrush>
  </Grid.Background>
</Grid>

这个代码片段应该在页面底部显示一个透明的覆盖,但是它创建了一个黑色的覆盖,就像它在现有的背景(也是颜色stdBackgroundColor)的基础上添加透明值一样,因此看起来很奇怪(见下图)。

如何在没有这种效果的情况下实现内容的透明覆盖(如ScrollViewer)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-01 19:04:11

免责声明,我在工作,我没有访问一个平台,我可以测试这段代码,但从我所查到的,它应该可以工作。

根本的问题是颜色混合,即我们想要顺利地混合从完全阿尔法到任何任意颜色。从Color.Transparent开始的问题是,当alpha通道比其他组件前进得更快时,您将得到一条白色的通道。一个类似的问题发生在#00000000上,因为它有一条黑色的带子。解决方案是从颜色的一个版本开始,该版本的不透明度设置为0。根据您正在开发的基于XAML的应用程序的哪个版本,我们如何做到这一点略有不同--我发现很难保持原样。在UWP中,我们没有一个不透明掩码,我们不能单独在不透明度上创建一个梯度。剩下的唯一的事情就是使用IValueConverter。

Color属性在GradientStop中是一个Color,而不是一个Brush,因为这会使呈现系统过于复杂。因此,我们需要的第一步是获取任何IValueConverter并去掉alpha值的Color

代码语言:javascript
复制
public class TransparentColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                          object parameter, string language)
    {
        Color convert = (Color) value; // Color is a struct, so we cast
        return Color.FromArgb(0, convert.R, convert.G, convert.B);
    }

    public object ConvertBack(object value, Type targetType,
                              object parameter, string language)
    {
         throw new NotImplementedException();
    }
}

下一个挑战是创建一个绑定,我们可以使用这种颜色。绑定对象允许我们指定一个Source,它可以是传入的任何对象。ElementName不能工作,因为资源是由键而不是名称引用的。

代码语言:javascript
复制
<LinearGradientBrush x:Key="OpacityGradientBrush" StartPoint="0,0" EndPoint="0,1">
  <GradientStop Color="{Binding Source={StaticResource stdBackgroundColor},
                       Converter={StaticResource TransparentColorConverter}}" Offset="0"/>
  <GradientStop Color="{StaticResource stdBackgroundColor}" Offset="1"/>
</LinearGradientBrush>

当然,不要忘记将TransparentColorConverter放在Resources中,这样您就可以在这里引用它。就我个人而言,我宁愿不用转换器,但在这种情况下,我认为这是合理的。

注意:我们在绑定中使用Source,这样我们就可以引用静态资源。如果我们有一个可以绑定的属性,我们可以使用Path代替。

下面的答案对WPF有效,但不适用于UWP。我希望微软不再以不相容的方式重新定义同样的概念,但这是我们生活的世界。

基于this answer的我的答案修正

您希望将LinearGradientBrush更改为使用不透明度属性,而不是使用颜色#00000000。问题是,它是插值从基本上黑色到你想要的颜色。要获得您想要的效果,您需要设置这样的不透明掩模刷:

代码语言:javascript
复制
<LinearGradientBrush x:Key="OpacityGradientBrush" StartPoint="0,0" EndPoint="0,1">
  <GradientStop Color="#00FFFFFF" Offset="0"/>
  <GradientStop Color="#FFFFFFFF" Offset="1"/>
</LinearGradientBrush>

然后,在您需要应用不透明掩码的代码中,您可以这样引用它:

代码语言:javascript
复制
<Grid VerticalAlignment="Bottom" Height="40" Grid.Row="3"
    Background="{StaticResource stdBackgroundColor}"
    OpacityMask="{StaticResource OpacityGradientBrush} Margin="0,0,0,-1"/>

问题是,如果你想要混合只影响不透明度,其余的颜色必须是相同的。你会得到一个波段的起始颜色褪色,并改变为结束颜色,否则。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35134824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档