我们有它继承面板和具有同样落实到SplitContainer的方向属性取向性的自定义面板。对于我们的自定义面板,DockStyle.Fill从来都不是有效的,这取决于Orientation属性值,DockStyle需要向左或向右垂直或顶部或底部的水平。
该DockStyleEditor类是密封的,所以我们不能继承它为我们自己的自定义UITypeEditor的。有没有一种方法使用TypeDescriptor或一些其他的方式来覆盖特定的行为?
我们想为我们在属性网格自定义面板DockStyle编辑器做的是: 1.可以禁用中心填充按钮或与红色斜线圆圈显示它,以表明它是作为一个选项不可用 2.禁用顶部和底部的按钮时,取向性水平 3.禁用左,右按键时Orientation属性是垂直的
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);
}
}
要使用它,这是不够的装饰,其中包含编辑属性控件的属性Dock
:
[Editor(typeof(MyDockEditor), typeof(UITypeEditor))]
public override DockStyle Dock
{
get { return base.Dock; }
set { base.Dock = value; }
}
正如你在下面的图片看,只剩并启用权利。