【问题标题】:How can I override behavior of DockStyle Editor in PropertyGrid如何在 PropertyGrid 中覆盖 DockStyle 编辑器的行为
【发布时间】:2016-03-24 03:00:05
【问题描述】:

我们有一个自定义面板,它继承了 Panel 并有一个与 SplitContainer Orientation 属性类似的 Orientation 属性。对于我们的自定义面板,DockStyle.Fill 永远无效,并且取决于 Orientation 属性值,DockStyle 需要是 Left 或 Right 用于 Vertical 或 Top 或 Bottom 用于水平。

DockStyleEditor 类是密封的,因此我们不能为我们自己的自定义 UITypeEditor 子类化它。有没有办法使用 TypeDescriptor 或其他方式覆盖某些行为?

我们希望在属性网格中为自定义面板 DockStyle 编辑器做的事情是:
1.禁用中心填充按钮或用红色斜线圆圈显示它以指示它作为选项不可用
2.当Orientation属性为水平时禁用顶部和底部按钮
3.当Orientation属性为垂直时禁用左右按钮

【问题讨论】:

    标签: c# winforms custom-controls windows-forms-designer uitypeeditor


    【解决方案1】:

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

    要使用它,只需使用 Editor 属性装饰控件的 Dock 属性即可:

    [Editor(typeof(MyDockEditor), typeof(UITypeEditor))]
    public override DockStyle Dock
    {
        get { return base.Dock; }
        set { base.Dock = value; }
    }
    

    如下图所示,只有左右启用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      相关资源
      最近更新 更多