从 Visual Studio 中的“属性”窗格中删除属性

本文关键字:属性 删除 Studio 中的 Visual | 更新日期: 2023-09-27 18:36:28

是否可以从 Visual Studio 的"属性"窗格中删除一个窗体属性或一组属性?

背景故事:我制作了一些继承常见表单属性的用户控件,但我想从 Visual Studio 的"属性"窗格中删除"锚点"和"停靠"属性,因为 UserControl 将使用不同的大小调整逻辑,锚定和停靠似乎不支持这些逻辑。

我认为这是某种注释,但我不完全确定,而且我在Google上找不到任何内容。

提前感谢!

从 Visual Studio 中的“属性”窗格中删除属性

所需的属性是可浏览的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
    {
    }
}