【问题标题】: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。这样你就可以限制
你的类中的成员变量只有你真正的组件
需要成员变量——只是为了防止混乱。
同样适用于Modifiers 和Locked。
【讨论】:
-
虽然Modifiers 和GenerateMember 不是控件的实际属性并且是设计时属性,但是您可以通过创建自定义Designer 表单控件并覆盖PostFilterProperties 来删除它们我做了here。