我该如何在XAML中通过颜色组件定义Silverlight的颜色?

3
我将尝试将我的Silverlight控件的颜色设置为应用程序中使用的ResourceDictionary中定义的颜色的略微透明版本。
为此,我打算将颜色分成组件,以便可以获取RGB值,然后在其上设置自己的alpha值,以获得半透明颜色。
ResourceDictionary类似于:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:system="clr-namespace:System;assembly=mscorlib">

<system:Byte x:Key="PrimaryLightColorAlphaValue">#FF</system:Byte>
<system:Byte x:Key="PrimaryLightColorRedValue">#DB</system:Byte>
<system:Byte x:Key="PrimaryLightColorGreenValue">#E5</system:Byte>
<system:Byte x:Key="PrimaryLightColorBlueValue">#F1</system:Byte>
<Color x:Name="PrimaryLightColor"   A="{StaticResource PrimaryLightColorAlphaValue}"
                                    R="{StaticResource PrimaryLightColorRedValue}"
                                    G="{StaticResource PrimaryLightColorGreenValue}"
                                    B="{StaticResource PrimaryLightColorBlueValue}" />
<SolidColorBrush x:Name="PrimaryLightColorBrush" Color="{StaticResource PrimaryLightColor}" />

....

然后,我的应用程序会通过引用颜色或其组件来使用我的颜色。
....

<Border Background="{StaticResource PrimaryLightColorBrush}" />

....

<LinearColorKeyFrame KeyTime="00:00:00">
  <LinearColorKeyFrame.Value>
    <Color A="#CC"
           R="{StaticResource PrimaryLightColorBrushRedValue}"
           G="{StaticResource PrimaryLightColorBrushGreenValue}"
           B="{StaticResource PrimaryLightColorBrushBlueValue}" />
  </LinearColorKeyFrame.Value>
</LinearColorKeyFrame>

....

我的问题:

Silverlight XAML似乎不支持Byte类型:因此在ResourceDictionary中定义的颜色部分从未加载,并抛出“未找到类型'Byte'”的错误。

那么我该如何实现将A、R、G、B颜色值分解为字节的等效方法,而不使用字节?(使用字符串和类型转换?)或者也许有更好的方法来定义一个颜色,继承/使用它,然后覆盖其Alpha值?关键是我需要通过XAML实现这一点。

有什么想法吗?


你能否只使用纯色,并在需要透明度的元素上设置不透明度呢? - Stefan Dragnev
很遗憾,不是每个我需要半透明颜色的元素都有一个不透明度,而且 alpha 存储在颜色级别上。请参见我上面的 LinearColorKeyFrame 示例:它在其 Color 值上具有 alpha,但在 Color 或 LinearColorKeyFrame 级别上没有 Opacity 属性。 - Dave
1个回答

1

以下是使用更改字母的转换器进行操作的方法。

这就是转换器:

public class ChangeAlphaConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var color = (Color) value;
        color.A = byte.Parse((string) parameter);
        return color;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

这是如何使用它的:

<UserControl.Resources>
    <Color x:Key="BaseColor">#fff</Color>
    <SilverlightTests:ChangeAlphaConverter x:Key="ChangeAlpha"/>
</UserControl.Resources>
...
    <Border>
        <Border.Background>
            <SolidColorBrush Color="{Binding Source={StaticResource BaseColor}, Converter={StaticResource ChangeAlpha}, ConverterParameter=100}"/>
        </Border.Background>
    </Border>

在这个例子中,我们将边框的背景设置为纯白色(来自BaseColor),并将颜色的 alpha 值设置为 100(十进制)。

这听起来很有前途;我会试一试! - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接