Как заставить PropertyGrid показывать настраиваемый диалог для определенного свойства? - PullRequest
11 голосов
/ 11 декабря 2008

У меня есть класс со строковым свойством, имеющим как метод получения, так и метод установки, который часто бывает настолько длинным, что PropertyGrid усекает строковое значение. Как заставить PropertyGrid показывать многоточие, а затем запустить диалоговое окно, содержащее многострочное текстовое поле для удобного редактирования свойства? Я знаю, что мне, вероятно, нужно установить какой-то атрибут для свойства, но какой атрибут и как? Должен ли мой диалог реализовывать какой-либо специальный интерфейс дизайнера?

Обновление: Этот , вероятно, является ответом на мой вопрос, но я не смог найти его с помощью поиска. Мой вопрос носит более общий характер, и его ответ можно использовать для создания любого типа пользовательского редактора.

1 Ответ

17 голосов
/ 11 декабря 2008

Вам необходимо установить [Editor(...)] для свойства, присвоив ему UITypeEditor, который выполняет редактирование; вот так (с вашим собственным редактором ...)

using System;
using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;


static class Program
{
    static void Main()
    {
        Application.Run(new Form { Controls = { new PropertyGrid { SelectedObject = new Foo() } } });
    }
}



class Foo
{
    [Editor(typeof(StringEditor), typeof(UITypeEditor))]
    public string Bar { get; set; }
}

class StringEditor : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal;
    }
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService svc = (IWindowsFormsEditorService)
            provider.GetService(typeof(IWindowsFormsEditorService));
        if (svc != null)
        {
            svc.ShowDialog(new Form());
            // update etc
        }
        return value;
    }
}

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

...