3

Basically, how can I create my own set of Colors in a static class or the such so that I can do something like this:

What exists:

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

What I want:

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

3 に答える 3

5

リソース キーは何でもかまいません。そのため、Colora をキーと値として同時に使用できます。

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);
    }
}
于 2011-03-30T19:44:39.240 に答える
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}"

DynamicResource 拡張機能を使用して動作させるために 10 分を費やしましたが、実行できません。誰かが方法(または理由)を知っている場合は、お知らせください:)

于 2011-03-30T20:14:16.050 に答える
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})

于 2011-03-30T19:39:55.787 に答える