Есть ли лучший редактор StringCollection для использования в PropertyGrids? - PullRequest
4 голосов
/ 20 ноября 2008

Я активно использую PropertySheets в редакторе конфигурации моей прикладной платформы. Мне они очень нравятся, потому что с ними довольно легко работать (как только вы научитесь) и делаете редактирование пуленепробиваемым.

Одной из вещей, которые я храню в своей конфигурации, являются скрипты Python. Можно редактировать скрипт Python в редакторе StringCollection, который я и использовал, но между «возможным» и «пригодным» существует большое расстояние. Мне бы хотелось иметь редактор, который бы на самом деле поддерживал изменяемые размеры и моноширинные шрифты, сохранял пустые строки и - эй, давайте с ума сойдем от списка пожеланий - делал раскраску синтаксиса.

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

Я ковырялся в Google и не могу найти ничего похожего на то, что я описываю, поэтому я решил спросить здесь. Это решенная проблема? Кто-нибудь уже пытался создать лучший редактор?

Ответы [ 2 ]

4 голосов
/ 27 апреля 2013

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

1) Вы должны создать элемент управления редактора и извлечь его из System.Drawing.Design.UITypeEditor. Я назвал мой StringArrayEditor. Таким образом, мой класс начинается с

public class StringArrayEditor : System.Drawing.Design.UITypeEditor

Элемент управления PropertyGrid должен знать, что редактор является модальным, и он будет показывать кнопку эллипсов, когда выбрано указанное свойство. Поэтому вы должны переопределить GetEditStyle следующим образом:

        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal;
    }

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

        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        var editorService = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
        if (editorService != null)
        {
            var selectionControl = new TextArrayPropertyForm((string[])value, "Edit the lines of text", "Label Editor");
            editorService.ShowDialog(selectionControl);
            if (selectionControl.DialogResult == DialogResult.OK)
                value = selectionControl.Value;
        }
        return value ?? new string[] {};
    }

Так что же происходит? Когда пользователь нажимает на эллипсы, вызывается это переопределение. editorService устанавливается как интерфейс для нашей формы редактирования. Он настроен на форму, которую мы еще не создали, которую я называю TextArrayPropertyForm. TextArrayPropertyForm создается, передавая значение для редактирования. Для правильной оценки я также передаю 2 строки: одну для заголовка формы, а другую для метки вверху, объясняющей, что должен делать пользователь. Он отображается модально, и если была нажата кнопка ОК, значение обновляется в соответствии с тем, какое значение было установлено в selectionControl.Value из формы, которую мы создадим. Наконец это значение возвращается в конце переопределения.

Шаг 2) Создайте форму редактора. В моем случае я создал форму с 2 кнопками (buttonOK и buttonCancel), надписью (labelInstructions) и TextBox (textValue), чтобы имитировать редактор StringCollection по умолчанию. Код довольно прост, но если вам интересно, вот он.

using System;
using System.Windows.Forms;

namespace MyNamespace
{
    /// <summary>
    /// Alternate form for editing string arrays in PropertyGrid control
    /// </summary>
    public partial class TextArrayPropertyForm : Form
    {
        public TextArrayPropertyForm(string[] value,
            string instructions = "Enter the strings in the collection (one per line):", string title = "String Collection Editor")
        {
            InitializeComponent();
            Value = value;
            textValue.Text = string.Join("\r\n", value);
            labelInstructions.Text = instructions;
            Text = title;
        }

        public string[] Value;

        private void buttonCancel_Click(object sender, EventArgs e)
        {
            DialogResult = DialogResult.Cancel;
        }

        private void buttonOK_Click(object sender, EventArgs e)
        {
            Value = textValue.Text.Split(new[] { "\r\n" }, StringSplitOptions.None);
            DialogResult = DialogResult.OK;
        }
    }
}

Шаг 3) Скажите PropertyGrid использовать альтернативный редактор. Изменением между этим свойством и любым другим, используемым в элементе управления PropertyGrid, является строка [Editor].

    [Description("The name or text to appear on the layout.")]
    [DisplayName("Text"), Browsable(true), Category("Design")]
    [Editor(typeof(StringArrayEditor), typeof(System.Drawing.Design.UITypeEditor))]
    public string[] Text {get; set;}

Теперь, когда вы создаете PropertyGrid на форме и устанавливаете класс, содержащий это свойство Text, он будет редактировать в вашей пользовательской форме. Есть бесчисленное множество возможностей изменить свою форму по вашему выбору. С изменениями это будет работать для редактирования любого типа, который вам нравится. Важно то, что элемент управления редактора возвращает тот же тип, что и свойство в переопределенном EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)

Надеюсь, это поможет!

2 голосов
/ 20 ноября 2008

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

Некоторые ресурсы, с которых можно начать:

...