阻止Designer删除Control成员上的Attributes

时间:2012-01-23 16:57:25

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

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

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

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

public System.Windows.Forms.Label label1;

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

如何阻止Designer删除我的属性?

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

谢谢! richn

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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

如果你真的想要属于你的设计师代码的属性,你应该做一个空的应用程序,并自己做表单代码。如果您不了解如何从头开始,那么您不应该尝试修改设计器代码

如果这看起来很多,你总是可以尝试将设计器用作模型,然后将其复制到一个新的非Windows窗体项目中。

答案 2 :(得分:0)

直到最近,我才开始相信设计师只是代码的一部分而且不容小觑。我错了。事实证明你可以把整个事情撕掉,然后编译器会向你抛出一个错误。好的,没关系,只需定义自己的东西,完全消除设计师的必要性。这是怎么回事。假设你有一个标签

<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;

注意我添加了图片和文本框作为附加示例。和huzza!因此,您完全不需要designer.cs文件。哦,请注意,designer.cs文件只不过是我们上面所做的,但它会自动为您完成。 ......大部分时间......当它失败时,是时候以自己的方式处理事情了。我敢肯定,如果你重新格式化你的电脑,重新安装所有东西等等,毫无疑问,事情会再次发挥作用。对于那些没有时间照顾孩子并解决微软所做的每一个小小问题的人来说,这只是一个合法的工作。