创建自己的系统颜色

时间:2011-03-30 18:57:40

标签: wpf resources colors dynamicresource staticresource

基本上,如何在静态类中创建我自己的一组颜色,以便我可以这样做:

存在什么

<Setter ... Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>

我想要什么

<Setter ... Value="{DynamicResource {x:Static MyColors.Color1}}"/>

3 个答案:

答案 0 :(得分:5)

资源键可以是任何内容,因此您可以同时使用Color作为键和值:

public static class MyColors
{
    static MyColors()
    {
        App.Current.Resources.Add(MyHighlightColorKey, MyHighlightColorKey);
    }

    public static readonly Color MyHighlightColorKey = Color.FromArgb(255, 0, 88, 0);
}

静态构造函数使用自身作为应用程序资源的键来添加颜色。

SystemColors在内部为每个定义的颜色或画笔使用SystemResourceKeys,但您无权访问该类(这是有道理的),或者您可以继承ResourceKey if {您将使用该值作为自己的密钥

时会遇到问题

你可以像这样使用它:

<TextBox>
    <TextBox.Background>
        <SolidColorBrush Color="{DynamicResource {x:Static local:MyColors.MyHighlightColorKey}}"/>
    </TextBox.Background>
</TextBox>

如果你需要覆盖本地级别的密钥,你也可以这样做:

<Window.Resources>
    <Color x:Key="{x:Static local:MyColors.MyHighlightColorKey}" A="255" R="255" G="0" B="0"/>
</Window.Resources>

编辑:如果您有很多颜色,画笔等等,您也可以使用反射在构造函数中进行资源注册(我使用了字段,如果您使用属性来公开您需要的数据稍微调整一下):

static MyColors()
{
    FieldInfo[] keyFieldInfoArray = typeof(MyColors).GetFields();
    foreach (var keyFieldInfo in keyFieldInfoArray)
    {
        object value = keyFieldInfo.GetValue(null);
        App.Current.Resources.Add(value, value);
    }
}

答案 1 :(得分:4)

我以为我会选择其他选项。您可以通过执行以下操作来使用静态资源...

public struct MyColors
{
    public static Brush Color1
    {
        get { return Brushes.Red; } // or whatever you like
    }
    public static Brush Color2
    {
        get { return Brushes.Blue; }
    }
}

然后在您的XAML中,使用:

"{x:Static local:MyColors.Color1}"

我花了10分钟试图让它与DynamicResource扩展一起工作,但我不能这样做。如果有人知道如何(或为什么),请告诉我们:)

答案 2 :(得分:1)

您可以轻松完成此操作。您必须定义以下类:

public class MyColors
{
    public static string Color1{ get{return "Color1Key";}}
}

,例如在您的App.xaml中:

<Application ...>
    <Application.Resources>
        <Color x:Key="Color1Key">#FF969696</Color>
    </Application.Resources>
</Application>

因为静态字符串实际上只是用于强类型我通常不创建这样的静态类,只使用我定义的任何键,所以这变成:

<Setter ... Value="{DynamicResource Color1Key}"/>

(我相信您也可以使用<Color x:Key="{x:Static MyColors.Color1}">#FF969696</Color>中的强类型,但我现在不确定......)

(还要注意使用x:Static,你必须指定MyColors所在的命名空间,这样就变成{x:Static local:MyColors.Color1}