阻止设计器删除控件成员上的属性

本文关键字:成员 属性 控件 删除 | 更新日期: 2023-09-27 18:21:06

我想用属性标记Windows窗体上的某些控件。所以我在TestAttributes.Designer.cs:中添加了属性

[AmbientValue(true)]
private System.Windows.Forms.Label label1;

但是,每当我使用设计器的属性窗口更改label1的Modifiers-属性时,设计器都会悄悄地从声明中删除我的属性:

public System.Windows.Forms.Label label1;

我尝试将声明放在TestAttributes.cs中,以避免与.Designer.cs文件发生冲突。但是,当更改Modifiers属性时,声明将移回TestAttributes.Designer.cs,Attribute也将消失。

如何阻止设计器删除我的属性?

编辑:问题应该是:我是否可以永久地将控件的声明移出*.Designer.cs文件,以便在那里应用Attribute?正如我在上面所写的,在某些情况下,它会向后移动。

谢谢!richn

阻止设计器删除控件成员上的属性

如果您想保持对设计器的支持,我建议您使用外部类库。

    namespace ClassLibrary1
    {
        [System.ComponentModel.AmbientValue(true)]
        public class TestClass : System.Windows.Forms.Label
        {
        }
    }

您可以将类似的内容编译到类库中,然后将其导入visualstudio。如果你不知道如何做到这一点,请按照下面的说明进行操作。

  1. 右键单击工具箱
  2. 单击"选择项目"
  3. 等等。现在不要犯终止visualstudio的错误
  4. 选择浏览
  5. 选择您的dll文件

我通常不喜欢那些给出"不要做"答案,但不要做的人。

更改设计器类是危险的,并且几乎总是会导致意外的后果。设计器代码是为编译器保留的,它应该始终看起来像编译器期望的那样。

如果你真的想在原本应该是你的设计器代码中使用属性,那么你应该制作一个空的应用程序,并自己编写表单代码。无论如何,如果你不知道如何从头开始,你就不应该试图修改设计器代码

如果这看起来工作量很大,您可以尝试将设计器用作模型,然后将其复制到一个新的非windows窗体项目中。

Untill最近我被引导相信设计器只是代码的一部分,它是不可触碰的。我错了。事实证明,你可以把整个东西撕下来,然后编译器会向你抛出一个错误。好吧,没关系,只要定义你自己的东西,这样就完全消除了设计师的必要性。以下是如何操作。假设你有一个标签

<div id="div1" runat="server">

并且您希望在没有任何designer.cs文件的情况下使其在背面不可见(我们删除了它)。首先将它与其他声明一起引用(即page_load之外,外部的某个地方)

protected System.Web.UI.HtmlControls.HtmlGenericControl div1;

但是,请记住,您必须引用前面使用的带有runat="server"标记的所有内容。假设你有一个页面只有runat="server"标签,在背面我们称之为

namespace yournamespace.something
{
    public class yourpagetitle: System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Image imgLogo;
        protected System.Web.UI.WebControls.TextBox tbDate;
        protected System.Web.UI.WebControls.Label yourLabelName;

请注意,我添加了图像和文本框作为附加示例。还有胡扎!因此,您完全不需要designer.cs文件。哦,请注意,designer.cs文件只不过是我们上面所做的,但它会自动为您提供。。。大多数时候。。。当它失败时,是时候用自己的方式处理事情了。我相信,如果你重新格式化你的电脑,重新安装所有东西,等等,毫无疑问,一切都会恢复正常。对于那些没有时间照顾和解决微软每一个小问题的人来说,这只是一个合理的解决方案。