DockEditor 已密封,但您可以基于DockEditor 创建自定义停靠编辑器,而无需继承它。在您的自定义UITypeEditor 中,您可以创建DockEditor 的实例并使用反射操作其编辑器控件,然后使用它执行值编辑。
DockEditor 使用 DockUI 控件,这是一个私有类。它有一个复选框None 按钮和容器控件,其中包含Fill、Top、Left、Right 和Bottom 的复选框。
然后您可以根据您的逻辑简单地更改Enabled、BackColor 或其他属性。
在下面的代码中,我会找到那些复选框按钮,我将禁用 Fill、Top、Bottom 和 None。用户可用的唯一选项是 Left 和 Right:
public class MyDockEditor : UITypeEditor
{
DockEditor editor;
public MyDockEditor()
{
editor = new System.Windows.Forms.Design.DockEditor();
}
public override object EditValue(ITypeDescriptorContext context,
IServiceProvider provider, object value)
{
Type dockUiType = typeof(DockEditor)
.GetNestedType("DockUI", BindingFlags.NonPublic);
var dockUiConstructor = dockUiType.GetConstructors()[0];
var dockUiField = typeof(DockEditor)
.GetField("dockUI", BindingFlags.Instance | BindingFlags.NonPublic);
var dockUiObject = dockUiConstructor.Invoke(new[] { editor }) as Control;
dockUiField.SetValue(editor, dockUiObject);
var container = dockUiObject.Controls[0];
var none = dockUiObject.Controls[1];
var fill= container.Controls[0];
var left= container.Controls[1];
var right= container.Controls[2];
var top = container.Controls[3];
var bottom = container.Controls[4];
none.Enabled = false;
fill.Enabled = false;
top.Enabled = false;
bottom.Enabled = false;
return editor.EditValue(context, provider, value);
}
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return editor.GetEditStyle(context);
}
}
要使用它,只需使用 Editor 属性装饰控件的 Dock 属性即可:
[Editor(typeof(MyDockEditor), typeof(UITypeEditor))]
public override DockStyle Dock
{
get { return base.Dock; }
set { base.Dock = value; }
}
如下图所示,只有左右启用。