如何在运行时打开复杂属性的属性对话框而不使用PropertyGrid?

3
考虑一个包含自定义UserControl和Button的表单。
在Visual Studio设计器中,您可以单击属性右侧的按钮(就像更改其他常见控件属性(如字体或图像)时一样),并使用此属性的编辑器。
在运行时,如果您将PropertyGrid添加到表单并将其指向此UserControl,则还可以单击该复杂属性右侧的按钮以在运行时获取相同的UITypeEditor对话框。
如何通过例如按钮单击在运行时让此编辑器窗口弹出,而无需在表单上拥有PropertyGrid?
尽管我已经从此描述符获得了PropertyDescriptor和UITypeEditor,但我不知道在调用UITypeEditor.EditValue时要调用哪些ITypeDescriptorContext和IServiceProvider的实例来显示编辑器。
这与为属性构建自定义UITypeEditor有关:使用丰富的设计时功能构建Windows窗体控件和组件。在这种情况下,我已经配置好了所有内容,它们都运作得非常好,所以我只想在运行时调用编辑器窗口。

这是一个重复的问题,几乎没有任何有用的信息:http://stackoverflow.com/questions/2047277/using-ui-editor-at-runtime-on-a-button-click。 :/ - Jon B
1个回答

0
如果你已经成功实现了一个 TypeDescriptor,那么你就快完成了。
这可能是一个好的开始:

public class MyEditor: UITypeEditor {

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

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) {
        IWindowsFormsEditorService  service = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
        if (service != null) {
            SomeControl ctrl = new SomeControl();
            ctrl.XYZ = ...
            service.DropDownControl(ctrl);
            value = ctrl.XYZ;
        }
        return value;
    }

WinForms 处理其余部分。

GetEditStyle 返回 UITypeEditorEditStyle.Modal,如果您有一个表单而不是控件,则使用 service.ShowDialog(ctrl)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接