2016-11-28 2 views
2

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

код за

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

XAML

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

enter image description here

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

+2

Согласно [Исходный код] (http://wpftoolkit.codeplex.com/SourceControl/latest#Main/Source/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.Toolkit/Core/Utilities/ColorUtilities.cs) имя не определяется записями в «Доступные цвета», а метод расширения «ColorUtilities.GetColorName». Возможно, он будет работать, если вы добавите свой цвет в ColorUtilities.KnownColors'. –

+0

@ManfredRadlwimmer, можете ли вы добавить это как ответ, я соглашусь же, это работает !, загрузил исходный код! Ура, – Sandepku

ответ

1

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

Согласно Source Code имя не определяется по записям в AvailableColors, но метод расширения ColorUtilities.GetColorName. Возможно, он будет работать, если вы добавите свой цвет в ColorUtilities.KnownColors.

A (грязный) обходной путь, пока разработчики не исправить это было бы игнорировать что 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); 

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