IWindowsFormsEditorService задержка после закрытия - PullRequest
2 голосов
/ 15 марта 2019

Мне нужно, чтобы в элемент управления PropertyGrid был встроен редактор значений свойств.Код указан ниже

internal class VariableTypeEditor : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.DropDown;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService service = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;

        Type type = context.GetType();
        PropertyInfo property = type.GetProperty("OwnerGrid");

        IPlugIn plug = context.Instance as IPlugIn;

        if (service != null && property != null
                            && plug != null)
        {
            PropertyGrid owner = property.GetValue(context) as PropertyGrid;

            if (owner != null)
            {
                Collection<VariableWrapper> variables = owner.Tag as Collection<VariableWrapper>;

                if (variables != null)
                {
                    VariableEditorForm editor = new VariableEditorForm();
                    editor.Value = plug.VariableName;
                    editor.Variables = variables.Select(o => o.Variable).Where(o => o.ValueType == plug.VariableType).ToArray();
                    editor.TopLevel = false;
                    editor.FormClosed += new FormClosedEventHandler((sender, args) =>
                    {
                        service.CloseDropDown();
                    });

                    service.DropDownControl(editor);
                    value = editor.Value;
                }
            }
        }

        return value;
    }
}

Я хочу, чтобы он работал следующим образом:

  • для изменения значения свойства пользователь открывает DropDown с VariableEditorForm (используя PropertyGrid)
  • пользователь выбирает одно из значений, перечисленных в VariableEditorForm, и после этого VariableEditorForm автоматически закрывается

Теперь это работает.Но по какой-то причине метод EditValue возвращает свое значение в течение 2-3 секунд.

Почему service.DropDownControl(editor) не возвращается сразу после закрытия?

1 Ответ

0 голосов
/ 16 марта 2019

Мне удалось найти решение. Я не люблю, но это работает. Код указан ниже.

            public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
            {
                IWindowsFormsEditorService service = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;

                Type type = context.GetType();
                PropertyInfo property = type.GetProperty("OwnerGrid");

                IPlugIn plug = context.Instance as IPlugIn;

                if (service != null && property != null
                                    && plug != null)
                {
                    PropertyGrid owner = property.GetValue(context) as PropertyGrid;

                    if (owner != null)
                    {
                        Collection<VariableWrapper> variables = owner.Tag as Collection<VariableWrapper>;

                        if (variables != null)
                        {
                            VariableEditorForm editor = new VariableEditorForm();
                            editor.Value = plug.VariableName;
                            editor.Variables = variables.Select(o => o.Variable).Where(o => o.ValueType == plug.VariableType).ToArray();
                            editor.TopLevel = false;
                            editor.FormClosed += new FormClosedEventHandler((sender, args) =>
                            {
                                // disable main form rendering
                                User32.PostMessage(Process.GetCurrentProcess().MainWindowHandle, Messages.WM_DISABLE_RENDER, IntPtr.Zero, IntPtr.Zero);
                                service.CloseDropDown();
                            });

                            service.DropDownControl(editor);

                            // enable main form rendering
                            User32.PostMessage(Process.GetCurrentProcess().MainWindowHandle, Messages.WM_ENABLE_RENDER, IntPtr.Zero, IntPtr.Zero);
                            value = editor.Value;
                            editor.Dispose();
                        }
                    }
                }

                return value;
            }

Дело в том, что в основной форме у меня есть панель, которая использует таймер для постоянной визуализации. Я заметил, что моя проблема исчезает каждый раз, когда я отключаю этот таймер. Поэтому, не имея лучшего решения, я решил отправить сообщение в мою основную форму, чтобы включить / отключить упомянутый таймер.

Буду признателен, если кто-нибудь предоставит правильное решение моей проблемы.

...