2011-03-30 87 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