创建自己的系统颜色

mic*_*ael 3 wpf resources colors dynamicresource staticresource

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

什么存在:

<Setter ... Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
Run Code Online (Sandbox Code Playgroud)

我想要的:

<Setter ... Value="{DynamicResource {x:Static MyColors.Color1}}"/>
Run Code Online (Sandbox Code Playgroud)

H.B*_*.B. 5

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

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

    public static readonly Color MyHighlightColorKey = Color.FromArgb(255, 0, 88, 0);
}
Run Code Online (Sandbox Code Playgroud)

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

(对于每个定义的颜色或画笔都在内部SystemColors使用SystemResourceKeys,但是你无权访问该类(这是有道理的),或者你可以ResourceKey在使用该值作为自己的键时遇到问题而继承子类)

你可以像这样使用它:

<TextBox>
    <TextBox.Background>
        <SolidColorBrush Color="{DynamicResource {x:Static local:MyColors.MyHighlightColorKey}}"/>
    </TextBox.Background>
</TextBox>
Run Code Online (Sandbox Code Playgroud)

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

<Window.Resources>
    <Color x:Key="{x:Static local:MyColors.MyHighlightColorKey}" A="255" R="255" G="0" B="0"/>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

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

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