16

XAML 中有没有办法从具有不同自定义透明度级别的命名颜色创建颜色对象?例如

<Label Background="{SkyBlue;220}" />

我知道这不起作用,但只是想引用一个例子。

4

2 回答 2

39

当你自己找到答案的时候。这是任何未来读者的正确方法:

<Label.Background>
    <SolidColorBrush Color="SkyBlue" Opacity=".9" />
</Label.Background>

Opacity范围在 0 和 1 之间,1 表示完全不透明(不透明)。

编辑

关于@Dai 的评论,如果您引用已经设置了一些透明度的颜色资源,此方法确实不会重置或覆盖指定颜色的透明度级别。例如,如果您的资源颜色的SkyBlue透明度设置为 0.5,而现在您想将其设置为 0.7,则上述方法将无法直接工作。

为了处理这种情况,您需要做的就是创建一个Converter重置输入颜色的 alpha 分量的小程序。像这样的东西:

public class NoTransparencyConverter : IValueConverter
{
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  {
    var C = ((Color)value);
    return Color.FromArgb(0xFF, C.R, C.G, C.B);
  }

  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  {
    throw new NotSupportedException();
  }
}

然后在您的 XAML 中使用它:

<SolidColorBrush Color="{Binding Path="YOUR_COLOR_RESOURCE" Converter={x:Static NoTransparencyConverter}}" Opacity=".9" />
于 2013-02-27T14:41:35.560 回答
27

只是为了给这个加一点。是的,您绝对可以Opacity按照您在答案中显示的那样设置 via 声明性,但您甚至不需要设置依赖属性,您可以通过使用您的值Alpha顶部(由方式提供比)更好的性能。例如,假设您具有Black的价值,并且您想给它一些不透明性。可以添加该值的前 2 个八位字节来完成同样的事情。RGBopacity

例如;

“#000000” = 黑色(实心)

然而;

“#33000000” = 黑色(不透明度为 20%)

"#77000000" = 黑色(不透明度为 47%)

“#E5000000” = 黑色(不透明度为 90%)

只是为了在那里进行一些详细说明,并可能在将来该Opacity属性可能不那么容易获得或被设置为不可变时为您提供帮助。希望这可以帮助。

附录:还值得注意的是,对像 alpha 这样的属性进行设置总是比对整个元素设置不透明度更有效。这也适用于 HTML/CSS 场景,其中类似background-color: rgba(0,0,0,.5)的做法比说<div style="background: black;opacity: .5)

于 2013-02-27T19:52:58.293 回答