我怎么能覆盖的PropertyGrid DockStyle编辑器的行为

问题描述 投票:1回答:1

我们有它继承面板和具有同样落实到SplitContainer的方向属性取向性的自定义面板。对于我们的自定义面板,DockStyle.Fill从来都不是有效的,这取决于Orientation属性值,DockStyle需要向左或向右垂直或顶部或底部的水平。

该DockStyleEditor类是密封的,所以我们不能继承它为我们自己的自定义UITypeEditor的。有没有一种方法使用TypeDescriptor或一些其他的方式来覆盖特定的行为?

我们想为我们在属性网格自定义面板DockStyle编辑器做的是: 1.可以禁用中心填充按钮或与红色斜线圆圈显示它,以表明它是作为一个选项不可用 2.禁用顶部和底部的按钮时,取向性水平 3.禁用左,右按键时Orientation属性是垂直的

c# winforms custom-controls windows-forms-designer uitypeeditor
1个回答
3
投票

DockEditor是密封的,但你可以根据DockEditor创建自定义码头的编辑没有继承它。在您的自定义UITypeEditor,您可以创建DockEditor的实例,并使用反射操纵它的编辑控制,然后用它进行数值编辑的。

DockEditor使用DockUI控制,是一个私有的类。它有None按钮,其中包含对FillTopLeftRightBottom复选框容器控件的复选框。然后,你可以简单地改变EnabledBackColor或根据您的逻辑其他属性。

在下面的代码中,我会找到这些复选框,按钮和我将禁用FillTopBottomNone。可供用户使用的唯一的选择将是LeftRight

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; }
}

正如你在下面的图片看,只剩并启用权利。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.