在VS设计器中隐藏WinForm UserControl自定义属性

10

Visual Studio在设计时错误地调用了我的UserControl的自定义属性。

我已经阅读了许多有关使用 [Browsable (false)][DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 属性的帖子,但这对我没有起作用。

要复现此问题,请使用 Visual Studio 创建一个新的 Windows Forms 应用程序,然后将一个 User Control 添加到您的项目中,并将该 User Control 拖放到您的窗体上。如下所示,在您的User Control 中添加一个 公共自定义属性

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    [Browsable( false )]
    [DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )]
    public bool AreYouThere
    {
        get
        {
            MessageBox.Show( "Yes I Am Here!" );
            return true;
        }
    }
}

在Visual Studio设计器中打开表单时,如果我强制清理并重新构建解决方案,我会看到一个带有文本“是的我在这里!”的消息框,表示Visual Studio已调用我的用户控件上的AreYouThere属性。

这不应该发生,因为我已经使用[Browsable(false)][DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]属性装饰了AreYouThere属性。

有什么想法为什么会发生这种情况吗?

(此问题出现在Visual Studio 2010和2013中)。


你能在属性网格中看到该属性吗?你可能想要的是测试设计模式并防止代码执行。 - Mark Hall
不出意外,由于我使用了 [Browsable(false)] 属性,该属性不会在属性网格中显示。我可以在属性本身中测试是否处于设计模式,但这仍然无法阻止 Visual Studio 调用该属性。 - ahazzah
检查你的InitializeComponent方法,确保它不在其中。如果是这样,请将其删除并查看是否会重新创建。 - Mark Hall
我检查了Form和UserControl上的InitializeComponent。一切看起来都很干净 - 即使在清理/重建解决方案后,也没有对UserControl的AreYouThere属性进行显式调用。 - ahazzah
3个回答

12
为了将属性从所有可能的地方隐藏,您需要使用这些属性标记它。
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[EditorBrowsable(EditorBrowsableState.Never)]
[Bindable(false)]
[Browsable(false)]

那并不能解决问题。 - ahazzah

0
public class CustomDesigner : ControlDesigner
{
    private static string[] RemovedProperties = new[]
    {
        "AccessibilityObject","AccessibleDefaultActionDescription","AccessibleDescription",
        "AccessibleName","AccessibleRole","AllowDrop","Anchor","AutoEllipsis","AutoScrollOffset",
        "AutoSize","AutoSizeMode","FlatAppearance", "FlatStyle",
        "TextAlign","TextImageRelation","UseCompatibleTextRendering",
        "UseMnemonic","UseWaitCursor"
    };

    public CustomDesigner() { }

    protected override void PreFilterProperties(IDictionary properties)
    {
        foreach (string prop in RemovedProperties)
        {
            properties.Remove(prop);
        }
        base.PreFilterProperties(properties);
    }
}

[ToolboxItem(true)]
[DesignerCategory("code")]
[Designer(typeof(CustomDesigner))]
public partial class NewButton : Button
{
    public Color OnHoverBackColor
    {
        get { return _onHoverBackColor; }
        set
        {
            _onHoverBackColor = value;
            Invalidate();
        }
    }
}

0

不要将属性的默认值设置为您想要的值。在您的示例中,请将属性AreYouThere设置为false/true,并在父级或任何其他地方使用它时,例如在Load事件中,使用instanceOfUserControl1.AreYouThere = true/false


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接