是否可以从 Visual Studio 的“属性”窗格中删除表单属性或一组属性?
背景故事:我已经制作了一些继承通用表单属性的 UserControl,但我想从 Visual Studio 的“属性”窗格中删除“Anchor”和“Dock”属性,因为 UserControl 将使用不同的调整大小逻辑、锚定逻辑和对接似乎不支持。
我认为这是某种注释,但我不完全确定,我无法在谷歌上找到任何东西。
提前致谢!
是否可以从 Visual Studio 的“属性”窗格中删除表单属性或一组属性?
背景故事:我已经制作了一些继承通用表单属性的 UserControl,但我想从 Visual Studio 的“属性”窗格中删除“Anchor”和“Dock”属性,因为 UserControl 将使用不同的调整大小逻辑、锚定逻辑和对接似乎不支持。
我认为这是某种注释,但我不完全确定,我无法在谷歌上找到任何东西。
提前致谢!
您想要的属性是 Browsable http://msdn.microsoft.com/en-us/library/system.componentmodel.browsableattribute.browsable.aspx 在这些用户控件上覆盖 Dock 和 Anchor,添加该属性(使用“false”值)给他们看看是否可行(确保重新编译以便设计人员加载更改)
尝试将 Browsable 属性添加到属性:
using System.ComponentModel;
[Browsable(false)]
public override AnchorStyles Anchor {
get {
return base.Anchor;
}
set {
base.Anchor = value;
}
}
如果您不想覆盖您的属性,您可以使您的控件实现 ICustomTypeDescriptor 以控制属性网格中显示的内容。为此,您可以实现每个方法,除了返回将其实现委托给标准实现的属性(TypeDescriptor 的静态方法)的方法。这些方法的实现应该如下:
public String GetClassName()
{
return TypeDescriptor.GetClassName(this,true);
}
public AttributeCollection GetAttributes()
{
return TypeDescriptor.GetAttributes(this,true);
}
public String GetComponentName()
{
return TypeDescriptor.GetComponentName(this, true);
}
public TypeConverter GetConverter()
{
return TypeDescriptor.GetConverter(this, true);
}
public EventDescriptor GetDefaultEvent()
{
return TypeDescriptor.GetDefaultEvent(this, true);
}
public PropertyDescriptor GetDefaultProperty()
{
return TypeDescriptor.GetDefaultProperty(this, true);
}
public object GetEditor(Type editorBaseType)
{
return TypeDescriptor.GetEditor(this, editorBaseType, true);
}
public EventDescriptorCollection GetEvents(Attribute[] attributes)
{
return TypeDescriptor.GetEvents(this, attributes, true);
}
public EventDescriptorCollection GetEvents()
{
return TypeDescriptor.GetEvents(this, true);
}
public object GetPropertyOwner(PropertyDescriptor pd)
{
return this;
}
必须实现的方法是 GetProperties。它返回一个 PropertyDescriptionCollection,在您的情况下,它应该包含每个 PropertyDescriptor,除了您要隐藏的那些。像这样的东西:
public PropertyDescriptorCollection GetProperties()
{
pdColl = new PropertyDescriptorCollection(null);
foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(this))
if (pd.Name != "Dock" && pd.Name != "Anchor")
pdColl.Add(pd);
return pdColl;
}
覆盖该属性并将该Browsable
属性设置为 false。
[Browsable(false)]
public override AnchorStyles Anchor
{
get
{
return AnchorStyles.None;
}
set
{
// maybe throw a not implemented/ don't use message?
}
}
[Browsable(false)]
public override DockStyle Dock
{
get
{
return DockStyle.None;
}
set
{
}
}