【问题标题】:Remove GenerateMember and Modifiers Properties in Designer在 Designer 中删除 GenerateMember 和 Modifiers 属性
【发布时间】:2016-11-29 15:55:59
【问题描述】:

我创建了一个 Button 后代,我在其中隐藏了所有我不使用的属性。

我是这样做的:

[Browsable(false)]
[Bindable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Obsolete("", true)]
public new Boolean AllowDrop { get; set; }

大多数属性都被正确隐藏并且无法使用。

但是有两个属性我无法摆脱。

有没有办法在设计器中同时删除 GenerateMember 和 Modifiers?

【问题讨论】:

    标签: c# winforms visual-studio windows-forms-designer propertygrid


    【解决方案1】:

    您可以为您的控件创建一个新的ControlDesigner 并覆盖其PostFilterProperties 方法。该方法允许您更改或删除属性字典中的项目。

    属性字典中的键是属性的名称。尽管Modifiers and GenerateMember 不是控件的实际属性,它们是设计时属性,但您仍然可以通过这种方式删除它们:

    using System.Windows.Forms;
    using System.Windows.Forms.Design;
    [Designer(typeof(MyCustomControlDesigner))]
    public class MyCustomControl:Button
    {
    }
    public class MyCustomControlDesigner:ControlDesigner
    {
       protected override void PostFilterProperties(System.Collections.IDictionary properties)
       {
           base.PostFilterProperties(properties);
           properties.Remove("Modifiers");
           properties.Remove("GenerateMember");
       }
    }
    

    要在属性网格中隐藏属性,您可以为它们做同样的事情,而不是覆盖或隐藏它们。

    【讨论】:

      【解决方案2】:

      有点离题。主要针对那些正在努力禁用“父容器中的停靠”属性的人。 以下覆盖帮助了我:

      protected override void PostFilterAttributes(IDictionary attributes)
          {
              base.PostFilterAttributes(attributes);
      
              var oDockingAttribute = attributes.Values.OfType<DockingAttribute>().FirstOrDefault();
              var oNoDockingAttribute = new DockingAttribute(DockingBehavior.Never);
      
              if (oDockingAttribute != null) attributes[oDockingAttribute.TypeId] = oNoDockingAttribute;
          }
      

      【讨论】:

        【解决方案3】:

        我认为您不能删除它,因为它不是类属性而是设计时属性并且仅供设计者使用:

        如果您使用过 Visual Studio 的 Whidbey 版本,您可能会 注意到这个名为 GenerateMember 的新属性出现在 添加到 Windows 的所有控件和组件的属性网格 形式。想知道它是关于什么的?这实际上是一个设计时间 扩展器属性,允许您控制是否添加组件 表单被类中的成员变量或局部变量引用 InitializeComponent 中的变量。默认情况下,它设置为 true,但如果 你有任何你没有真正引用的组件 InitializeComponent,您可以将其设置为 false。这样你就可以限制 你的类中的成员变量只有你真正的组件 需要成员变量——只是为了防止混乱。

        同样适用于ModifiersLocked

        【讨论】:

        • 虽然ModifiersGenerateMember 不是控件的实际属性并且是设计时属性,但是您可以通过创建自定义Designer 表单控件并覆盖PostFilterProperties 来删除它们我做了here
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 2019-01-30
        相关资源
        最近更新 更多