Visual Studio 2008表单设计器混淆布尔属性值

3

我有一个非常烦人的问题需要解决几个星期了。我有一个WinForms C#项目,在其中开发了自定义控件(ListView + ToolStrip with ToolStripButtons)。该控件在解决方案内的不同窗体中使用,但在其他项目中使用。对于不同的窗体,我需要使某些按钮可见或隐藏,因此我已经向我的控件添加了相应的属性,例如

    public Boolean DeleteButtonVisible
    {
        get
        {
            return tsbDelete.Visible;
        }
        set
        {
            tsbDelete.Visible = value;
        }
    }

一些按钮默认是可见的,而有些则被隐藏。在设计器中,当我编辑包含我的控件的表单时,我可以更改这些属性,控件上的按钮会按照应该的方式变为可见或隐藏。但是每次我在我的控件源文件中更改任何内容时,在所有表单中这些属性都会重置为默认值,无论我在设计器中设置了什么,我都必须手动恢复这些值。好吧,我正在使用源代码控制,所以这并不难,但是每次我在另一个文件中稍微更改一点东西就要在几十个文件上执行“撤消”是一场灾难。

我尝试使用[DesignerSerializationVisibility]属性来解决这个问题。如果我将其与值“Hidden”一起使用,它根本没有起到任何作用-值根本没有保存。如果默认情况下它们是可见的,“Content”会使按钮随机消失。“Visible”没有效果,因为这是默认值...

我不想在我的代码中为每个表单设置每个按钮的可见性-这不是应该采取的方式。

有人知道这方面的信息吗?


您是否已使用 DefaultValue 属性指定属性的默认值? 或者您是在构造函数中设置这些值?设计器始终会遵守此属性提供的默认值。 - Jeff Mercado
我已经尝试了这种指定默认值的方式,它可以工作。问题在于,我可以在控件代码中执行此操作,而在使用它的表单中,我经常需要在表单设计者中设置非默认值 - 当更改控件代码中的单个字节时,这些值会丢失。 - Sergey Kudriavtsev
据我所知,如果您的属性使用此属性指定了默认值,则只要您不明确设置它,它将呈现为具有此值。 如果设计师需要刷新值,则未明确设置的任何内容都将回退到默认值。 没有该属性,可能不是您想要的默认值。 您应该在构造函数中设置默认值并使用属性设置相同的值。 - Jeff Mercado
@Jeff:我理解你的建议并尝试过了(实际上这就是我要解决的问题)。这些值在控件构造函数中设置,在DefaultValue属性中设置,然后在使用我的控件的表单中用非默认值进行覆盖。我希望这些值保持为非默认值并显式设置,但设计器在编辑控件代码时会强制清除任何覆盖。 - Sergey Kudriavtsev
1个回答

2

是的,Control.Visible属性是特殊的。getter方法不会返回最后分配的值,只有在控件实际可见时才返回true。这可能会产生副作用,你已经发现了其中一个。在这种情况下,可能是在控件从设计模式切换时引起的。要正确地执行此操作,您必须将分配状态存储在备份变量中。像这样:

    private bool tsbDeleteVisible;

    public bool DeleteButtonVisible {
        get { return tsbDeleteVisible; }
        set { tsbDelete.Visible = tsbDeleteVisible = value; }
    }

一定要将后备变量的默认值初始化为tsbDelete.Visible的默认值。使用构造函数以确保。


非常感谢这个提示!这确实是我缺少的东西。在为我的属性添加后备变量之后,一切都开始正常工作了。 - Sergey Kudriavtsev

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