2011-03-30 103 views
3

基本上,我怎么可以创造我自己的一组色彩在静态类或这样,这样我可以做这样的事情:创建您自己的系统颜色

什么存在

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

我想什么:

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

回答

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,如果你把问题与使用值作为自己的关键

您可以使用它像这样:

<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); 
    } 
} 
+0

这正是我想知道的。非常感谢H.B. – michael 2011-04-01 20:13:54

+0

很高兴帮助:) – 2011-04-01 20:26:51

+0

我对使用App.current.resources.add()添加资源的部分感到困惑。这实际上是做什么的?在使用{x:Static local:MyColors.MyHighlightColorKey} – redshift5 2015-10-29 09:46:51

1

您可以轻松地做到这一点。你必须定义下面的类:在你App.xaml你做

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

和例如:

<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}命名空间)

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扩展工作,但我不能这样做。如果有人知道如何(或为什么),然后让我们知道:)

+0

我喜欢这个,它更简单。 – BoltClock 2011-03-30 20:18:43

+1

要将其用作资源,您需要将其添加到资源字典中,对于在后台发生的'SystemColors',这些资源在应用程序级别不可见。查看我的答案以获取资源方法。 – 2011-03-30 20:22:26

+0

@ H.B。好的回答,谢谢:) – Tom 2011-03-30 20:25:49