Настраиваемая цветовая палитра в Редакторе свойств цвета Visual Studio

В конструкторе Visual Studio в окне свойства можно выбрать ForeColor, BackColor etc используя выбор цвета. Когда вы хотите выбрать цвет, палитра цветов появляется с вкладками "Custom, Web, System". Если вы выберете custom, вы сможете добавить новый цвет в средство выбора, но только нижние 2 строки изменчивы, и изменения не сохраняются в элементах управления. Поэтому, если вы добавляете цвет в палитру, при выборе другого элемента управления и хотите изменить для пример BackColor ваш предыдущий добавленный цвет отсутствует.

есть ли способ создать и импортировать пользовательский набор цветов в элемент управления выбора цвета дизайнера?

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

2 ответов


редактор, который поможет вам выбрать цвет в visual studio является ColorEditor который не сохраняет пользовательские цвета в разных элементах управления. Чтобы решить проблему, вы должны:

  • создать пользовательское UITypeEditor на основе ColorEditor
  • зарегистрируйте редактор для типа Color при запуске visual studio

вот подробный ответ, включая коды, которые я использовал для решения проблема.

Создать CustomColorEditor

ColorEditor использует частный ColorUI класс, чтобы показать частный ColorPalette управление. Палитра использует массив цветов для отображения пользовательских цветов.

создать CustomColorEditor я получил из ColorEditor и используя отражение, нашел эти члены и заполнил массив, используя статический массив некоторых цветов, чтобы показать при первой загрузке. Затем после закрытия редактора я получаю пользовательские цвета из редактора и помещаю их в статический массив и инициализировать редактор цветов, используя этот статический массив при следующей загрузке. Таким образом, пользовательские цвета разделяются между всеми экземплярами my CustomColorEditor.

показать CustomColorEditor вместо ColorEditor по умолчанию

чтобы показать редактор типов пользовательского интерфейса для всех свойств определенного типа, необходимо добавить Editor атрибут к типу. Но с Color не мой тип, как я мог добавить для это?

TypeDescriptor.AddAttributes помог мне зарегистрировать редактор для Color тип.

где я должен запустить код для регистрации атрибута? Конечно, во время выполнения visual studio!

для этого я создал проект пакета Visual Studio и поставил регистрационный код в Initialize способ упаковки. Я также добавил ProvideAutoLoad атрибут класса пакета, чтобы сделать его автоматической загрузкой при открытии решения.

затем я установил пакет.

затем я поместил dll в GAC, используя gacutil.exe /i "path to dll". Вместо GAC также можно поместить dll в Visual Studio рядом с devenv.exe потому что время выполнения visual stusio будет использовать его для отображения моего пользовательского редактора цветов для всех свойств цвета.

вывод

после выполнения вышеуказанных задач я открыл новый экземпляр visual studio, и в моем проекте Windows Forms я вижу свой пользовательский редактор цветов, показанный для цветов. Начальные цвета, которые я установил отображается. Кроме того, редактор цветов сохранял пользовательские цвета даже между различными формами!

я поделился кодами здесь. Вы можете использовать идею и коды для улучшения редактора. Вы можете предоставить свои собственные цвета для отображения в редакторе при запуске. Вы даже можете добавить другую вкладку в Редактор. Вот мой код:

код для цветного редактора

class CustomColorEditor : ColorEditor
{
    private static Color[] Colors;
    static CustomColorEditor()
    {
        Colors = new Color[]{
            Color.Red, Color.Green, Color.Blue, Color.White, 
            Color.White, Color.White, Color.White, Color.White, 
            Color.White, Color.White, Color.White, Color.White, 
            Color.White, Color.White, Color.White, Color.White, 
        };
    }
    public override object EditValue(ITypeDescriptorContext context, System.IServiceProvider provider, object value)
    {
        var colorEditorObject = this;
        Type colorUiType = typeof(ColorEditor).GetNestedType("ColorUI", BindingFlags.NonPublic);
        var colorUiConstructor = colorUiType.GetConstructors()[0];
        var colorUiField = typeof(ColorEditor).GetField("colorUI", BindingFlags.Instance | BindingFlags.NonPublic);
        var colorUiObject = colorUiConstructor.Invoke(new[] { colorEditorObject });
        colorUiField.SetValue(colorEditorObject, colorUiObject);
        var palField = colorUiObject.GetType().GetField("pal", BindingFlags.Instance | BindingFlags.NonPublic);
        var palObject = palField.GetValue(colorUiObject);
        var palCustomColorsField = palObject.GetType().GetField("customColors", BindingFlags.Instance | BindingFlags.NonPublic);
        palCustomColorsField.SetValue(palObject, Colors);
        var selectedValue = base.EditValue(context, provider, value);
        Colors = palCustomColorsField.GetValue(palObject) as Color[];
        return selectedValue;
    }
}

код для Пакет

[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
[Guid(GuidList.guidVSPackage1PkgString)]
[ProvideAutoLoad(Microsoft.VisualStudio.Shell.Interop.UIContextGuids80.SolutionExists)]
public sealed class VSPackage1Package : Package
{
    public VSPackage1Package() { }
    protected override void Initialize()
    {
        base.Initialize();
        TypeDescriptor.AddAttributes(typeof(Color), new EditorAttribute(typeof(CustomColorEditor), typeof(UITypeEditor)));
    }
}

результат

это будет результатом в окне свойств Visual Studio. Посмотрите на эти Red, Green, Blue в нижней части диалога, который мы добавлено:

enter image description here


Я знаю, что прошло довольно много времени...

вы можете использовать MergedDictionaries и ссылаться на словарь ресурсов в вашем приложении.XML-файл.

это поставит цвета, которые вы определяете в палитре, но вам придется включить тот же словарь ресурсов и ссылаться на него в каждом приложении.xaml для каждого используемого приложения, что, на мой взгляд, хорошо, потому что иногда вам приходится использовать пользовательские цвета для разных приложений.Пользовательские Цвета Палитра

Что-то вроде этого