考虑一个包含自定义UserControl
和Button
的表单。
在Visual Studio设计器中,您可以单击属性右侧的按钮(就像更改Font
或Image
等控件上的其他常用属性时那样)并使用编辑器这个属性。
在运行时期间,如果您已向表单添加PropertyGrid
并将其指向此UserControl
,则还可以在运行时单击该复杂属性右侧的按钮并获取相同的UITypeEditor
对话框。
如何在运行时通过单击按钮而不在表单上显示PropertyGrid
来启动此编辑器窗口?
虽然我已从此描述符中获得PropertyDescriptor
和UITypeEditor
,但我不知道在调用ITypeDescriptorContext
和IServiceProvider
的实例时应该调用什么调用UITypeEditor.EditValue
以显示编辑器。
这与为属性构建自定义UITypeEditor有关:Building Windows Forms Controls and Components with Rich Design-Time Features。在这种情况下,我已经配置了所有这些并且一切都很好用,所以我只想在运行时调用编辑器窗口。
答案 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)
。