Палитра цветов WPF - добавление нового пользовательского цвета

Я пытаюсь добавить новый пользовательский цвет в доступные цвета палитры цветов WPF.

Код позади

this.colorPicker1.AvailableColors.Add(new ColorItem(Color.FromArgb(255, 153, 153, 187), "Custom"));

XAML

<exceedToolkit:ColorPicker Name="colorPicker1" DisplayColorAndName="True"/>

Проблема в том, что когда я выбираю этот пользовательский цвет, в текстовом поле отображается шестнадцатеричное значение вместо имени цвета ("Пользовательский"), есть ли способ исправить это?

1 ответ

Решение

Как я уже упоминал в моем комментарии выше:

Согласно Исходному коду имя не определяется записями в AvailableColors но метод расширения ColorUtilities.GetColorName, Может быть, это будет работать, если вы добавите свой цвет в ColorUtilities.KnownColors тоже.

(Грязный) обходной путь до тех пор, пока разработчики не исправят это, будет игнорировать ColorUtilities класс приватный:

public static class ColorItemExtension
{
    public static bool Register(this ColorItem colorItem)
    {
        if (colorItem.Color == null) return false;

        Assembly assembly = typeof(ColorPicker).Assembly;
        Type colorUtilityType = assembly.GetType("Xceed.Wpf.Toolkit.Core.Utilities.ColorUtilities");
        if (colorUtilityType == null) return false;

        FieldInfo fieldInfo = colorUtilityType.GetField("KnownColors");
        if (fieldInfo == null) return false;

        Dictionary<string, Color> knownColors = fieldInfo.GetValue(null) as Dictionary<string, Color>;
        if (knownColors == null) return false;
        if (knownColors.ContainsKey(colorItem.Name)) return false;

        knownColors.Add(colorItem.Name, (Color) colorItem.Color);
        return true;
    }
}

Можно использовать так:

var colorItem = new ColorItem(Color.FromRgb(1, 2, 3), "Almost black");
colorItem.Register();
colorPicker1.AvailableColors.Add(colorItem);

Если это важно для вас, возможно, вы захотите обратить внимание разработчиков на эту проблему здесь.

Другие вопросы по тегам