如何在运行时没有PropertyGrid的情况下打开复杂属性的属性对话框

时间:2012-11-29 13:41:40

标签: c# winforms uitypeeditor

考虑一个包含自定义UserControlButton的表单。

在Visual Studio设计器中,您可以单击属性右侧的按钮(就像更改FontImage等控件上的其他常用属性时那样)并使用编辑器这个属性。

在运行时期间,如果您已向表单添加PropertyGrid并将其指向此UserControl,则还可以在运行时单击该复杂属性右侧的按钮并获取相同的UITypeEditor对话框。

如何在运行时通过单击按钮而不在表单上显示PropertyGrid来启动此编辑器窗口?

虽然我已从此描述符中获得PropertyDescriptorUITypeEditor,但我不知道在调用ITypeDescriptorContextIServiceProvider的实例时应该调用什么调用UITypeEditor.EditValue以显示编辑器。

这与为属性构建自定义UITypeEditor有关:Building Windows Forms Controls and Components with Rich Design-Time Features。在这种情况下,我已经配置了所有这些并且一切都很好用,所以我只想在运行时调用编辑器窗口。

1 个答案:

答案 0 :(得分: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处理其余部分。

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