在Designer中删除GenerateMember和Modifiers属性

时间:2016-07-26 06:27:25

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

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

我这样做:

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

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

然而,有两个属性是我无法摆脱的。

enter image description here

有没有办法在Designer中删除GenerateMember和Modifiers?

3 个答案:

答案 0 :(得分:3)

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

属性字典中的键是属性的名称。虽然ModifiersGenerateMember不是您控件的实际属性,但它们是设计时属性,但您可以通过以下方式删除它们:

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

要隐藏属性网格中的属性,您可以为它们执行相同的操作,而不是覆盖或遮蔽它们。

答案 1 :(得分:0)

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

  

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

同样适用于ModifiersLocked

答案 2 :(得分:0)

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

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