【问题标题】:Prevent Designer from removing Attributes on Control members防止设计器删除控件成员上的属性
【发布时间】:2012-01-23 16:57:25
【问题描述】:

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

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

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

public System.Windows.Forms.Label label1;

我尝试将声明放在TestAttributes.cs 中,以免与 .Designer.cs 文件混淆。但是当更改Modifiers 属性时,声明将移回TestAttributes.Designer.cs 并且属性消失了。

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

编辑: 最好的问题是:我可以永久将控件的声明移出*.Designer.cs 文件,以便我可以在那里应用属性吗?正如我在上面所写的,它在某些情况下会被移回。

谢谢! 丰富

【问题讨论】:

  • 这有很多问题。首先,您不应该修改*.Designer.cs 文件,因为它是由设计器自动重新生成的。这就是它默认隐藏的原因。其次,将Label 控件的环境值设置为true 没有任何意义。标签控件怎么可能是true?如有必要,从控件继承并添加所需的任何默认属性,然后在设计器中使用 那个 自定义控件。
  • 是的,我知道修改 .Designer.cs 文件是不好的,但我想也许有办法让 Label 的声明脱离那里。但我想我尝试的同样糟糕;-)。 LabelAmbientValue 只是测试应用程序中的示例,在我的实际应用程序中它是一个自定义属性。
  • 您始终可以将 *.Designer.cs 文件中的内容移出到您的自己的代码文件中。然后,设计师不会修改它们。当您想将代码添加到默认的 Dispose 方法时,这与您所做的相同。如果您知道它不好/不起作用,那么您仍然不清楚为什么要这样做。
  • 我确实尝试将声明移出*.Designer.cs 并移到我自己的代码文件中。但它被移回*.Designer.cs,当我更改Modifiers 属性时,我的属性丢失了。

标签: c# .net winforms visual-studio windows-forms-designer


【解决方案1】:

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

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

您可以将这样的内容编译到类库中,然后将其导入到 Visual Studio。如果您不知道如何操作,请按照以下说明操作。

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

【讨论】:

    【解决方案2】:

    我通常不喜欢那些给出“不做”答案但不做的人。

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

    如果您真的想要设计器代码中的属性,则应改为创建一个空应用程序,并自己编写表单代码。如果您不了解如何从头开始修改设计器代码,则无论如何都不应该尝试修改设计器代码

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

    【讨论】:

      【解决方案3】:

      直到最近,我才相信设计器只是代码的一部分,不能被触及。我错了。原来你可以把整个东西都撕掉,然后编译器会向你抛出一个错误。好吧,没关系,只要定义你自己的东西,完全消除设计师的必要性。这里是如何。假设你有一个标签

      <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 文件只不过是我们在上面所做的,但它会自动为您完成。 ......大多数时候......当它失败时,是时候按照自己的方式处理事情了。我敢肯定,如果你重新格式化你的电脑,重新安装一切,等等等等,毫无疑问,事情会再次起作用。对于那些没有时间照顾和排除 Microsoft 所做的每一个小问题的人来说,这只是一个合理的解决方法。

      【讨论】:

      • 是的,您可以避免使用*.designer.cs 文件如果您避免使用设计器。事实上,这就是文件的全部内容。它是一个由设计者自动生成的私有文件,为了方便起见,使用部分类来实现对用户隐藏它。如果您不使用设计器,则不必使用设计器文件。但是,如果您确实修改了设计器文件,那么每当您再次在设计器中工作时,它都会被重新编写。这里的系统没有任何问题。
      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 2010-09-06
      • 1970-01-01
      • 2014-01-17
      相关资源
      最近更新 更多