Как выровнять всплывающий редактор с ячейкой сетки? - PullRequest
0 голосов
/ 21 мая 2018

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

MyМетод UITypeEditor.EditValue получает объект PropertyDescriptorGridEntry в качестве параметра context, но он также не имеет координат, а его коллекция GridItems пуста.

Идеи кто-нибудь?Существуют ли (бесплатные) альтернативы PropertyGrid, предлагающие эту информацию?

Вот мой текущий код:

class MyPropertyGridEditor : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle( System.ComponentModel.ITypeDescriptorContext context )
    {
        return UITypeEditorEditStyle.Modal;
    }

    // Displays the UI for value selection.
    public override object EditValue( 
                      System.ComponentModel.ITypeDescriptorContext context,
                      System.IServiceProvider provider,
                      object value )
    {
        var form = new MyEditorForm( true );
        // ??? Where can I find Location and Size of the grid cell ???
        if( form.ShowDialog() == DialogResult.OK )
        {
            value = form.Items;
        }

        return value;
    }
}

Example of how my own editor shall be aligned

выше приведен пример того, как я хочу, чтобы моя форма была выровнена, в примере показан редактор цвета по умолчанию.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Поведение по умолчанию - сохранение выравнивания.Как также упоминалось в другом ответе, вы показываете диалоговое окно, а не раскрывающийся список.

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

public class MyComponent : Component
{
    [Editor(typeof(MyUITypeEditor), typeof(UITypeEditor))]
    public string SampleProperty { get; set; }
}

public class MyUITypeEditor : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.DropDown;
    }
    IWindowsFormsEditorService svc;
    public override object EditValue(ITypeDescriptorContext context,
        IServiceProvider provider, object value)
    {
        var list = new ListBox();
        var items = new[] { "A", "B", "C" };
        list.Items.AddRange(items);
        list.SelectionMode = SelectionMode.One;
        list.SelectedIndex = 0;
        if (items.Contains(($"{value}")))
            list.SelectedIndex = items.ToList().IndexOf($"{value}");
        list.SelectedValueChanged += List_SelectedValueChanged;
        svc = provider.GetService(typeof(IWindowsFormsEditorService))
            as IWindowsFormsEditorService;
        svc.DropDownControl(list);
        return list.SelectedItem;
    }

    private void List_SelectedValueChanged(object sender, EventArgs e)
    {
        svc.CloseDropDown();
    }
}
0 голосов
/ 21 мая 2018

Прежде всего - вы не показываете всплывающее окно, диалоговое окно.Это две разные вещи.

Компонент PropertyGrid довольно сложный, и настраиваемое всплывающее окно не так просто, как кажется.

Существует исходный код с цветным редактором, который можно вдохновить.

http://www.dotnetframework.org/default.aspx/DotNET/DotNET/8@0/untmp/whidbey/REDBITS/ndp/fx/src/Designer/Drawing/System/Drawing/Design/ColorEditor@cs/1/ColorEditor@cs

...