Создайте свою собственную систему цветов - PullRequest
3 голосов
/ 30 марта 2011

По сути, как я могу создать свой собственный набор цветов в статическом классе или что-то подобное, чтобы я мог сделать что-то вроде этого:

Что существует :

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

Что я хочу :

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

Ответы [ 3 ]

5 голосов
/ 30 марта 2011

Ключи ресурсов могут быть любыми, поэтому вы можете использовать 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);
    }
}
4 голосов
/ 31 марта 2011

думал, что я включу другой вариант. Вместо этого вы можете использовать статический ресурс, выполнив что-то вроде следующего ...

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, но я не могу этого сделать. Если кто-то знает, как (или почему), тогда сообщите нам:)

1 голос
/ 30 марта 2011

Вы можете легко это сделать.Вы должны определить следующий класс:

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})

...