你能改变VS Win Forms设计器代码生成吗?

时间:2010-04-08 13:09:49

标签: c# visual-studio winforms code-generation windows-forms-designer

我们实施了新的编码标准,要求我们的私人会员拥有领先的下划线。像这样:

private System.Windows.Forms.Label _label;

不幸的是,当您将新标签拖到表单上时,VS会在下面列出默认设置:

private System.Windows.Forms.Label label1;

有没有办法将默认值更改为:

private System.Windows.Forms.Label _label1;

这适用于所有控件,而不仅仅是标签,是的,它们将从代码中使用。

干杯,

普拉门

7 个答案:

答案 0 :(得分:11)

我个人认为自动生成的代码应该被排除在任何编码指南之外等等。在大多数情况下可以安全地忽略它们,除非生成器有错误。

请与编写该编码指南的人进行辩论并询问他。他们要排除生成的代码。

答案 1 :(得分:3)

除了创建自己的VS加载项,监视生成的代码并自动重命名,无法实现您想要的目标。

答案 2 :(得分:2)

我知道这是一个老问题,但我最近一直在与定制设计师合作,我有一个你想要的解决方案。将此课程添加到您的项目中:

using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;

namespace WindowsFormsApplication1
{
    [Designer(typeof(BaseFormDesigner), typeof(IRootDesigner))]
    public class BaseForm : Form
    {
        public BaseForm()
        {
        }
    }

    public class BaseFormDesigner : DocumentDesigner
    {
        public override void Initialize(IComponent component)
        {
            base.Initialize(component);
            var service = GetService(typeof(IComponentChangeService)) as IComponentChangeService;
            service.ComponentAdded += service_ComponentAdded;
        }

        private void service_ComponentAdded(object sender, ComponentEventArgs e)
        {
            if (e.Component is Control && !(e.Component is Form)) {
                var control = (Control)e.Component;
                if (!control.Name.StartsWith("_")) {
                    var service = GetService(typeof(IComponentChangeService)) as IComponentChangeService;
                    PropertyDescriptor desc = TypeDescriptor.GetProperties(control)["Name"];
                    service.OnComponentChanging(e.Component, desc);
                    string oldValue = control.Name;
                    string newValue = "_" + oldValue;
                    desc.SetValue(control, newValue);
                    service.OnComponentChanged(e.Component, desc, oldValue, newValue);
                }
            }
        }
    }
}

然后将基本表单类从Form更改为BaseForm:

using System;

namespace WindowsFormsApplication1
{
    public partial class Form1 : BaseForm
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

在重新编译项目之前关闭所有表单设计器,然后重新打开并尝试添加控件,其名称将以下划线开头。

答案 3 :(得分:1)

这个答案可能不尽如人意,但这是我能提供的最好的答案。

我认为您无法让Visual Studio Designer自动添加下划线。但是,您可以做的是使添加下划线的过程不那么痛苦。只需先创建没有下划线的对象;然后,使用“重构”功能重命名它们。只需将光标放在字段名称(label1,在您的情况下),然后按F2(或右键单击⇒重构⇒重命名)。无论您在代码中的哪个位置都可以使用,您只需提及label1即可。由于您可能正在编写使用控件的代码,因此您可能仍会引用这些字段。您也可以按F12直接进入声明,您可以有效地获得所有控件的完整列表;你可以轻松地使用F2一次性重命名它们。

顺便说一下,我还使用F2来重命名大多数自动生成的事件处理程序名称。例如,我讨厌看到像btnZoomIn_Click()这样的方法名称。我更喜欢调用方法zoomIn(),因为它就是这样做的。而不是Mainform_KeyPress()我可以称之为processKeyPress()

答案 4 :(得分:0)

您可以将GenerateMember设置为false 这不能解决您的问题,但是当您不使用手动控制时,请避免错误命名。

答案 5 :(得分:0)

Resharper可以强制执行命名约定。然后只需打开.designer文件并按下alt + enter,输入几次。

答案 6 :(得分:0)

正如BlueRaja所说,你可以使用Resharper。然后,您可以使用其代码清理(Ctrl-E,C),但这不适用于生成的文件,因此您必须暂时重命名它。我不在工作,所以我无法检查是否有选项可以在某处启用生成文件的选项。

请注意,每次重新生成文件时都必须重新运行。