Можете ли вы изменить генерацию кода VS Win Forms designer?

мы внедрили новые стандарты кодирования, которые требуют, чтобы наши частные члены имели ведущее подчеркивание. Вот так:

private System.Windows.Forms.Label _label;

к сожалению, VS выведет значение по умолчанию ниже, когда вы перетащите новую метку в свою форму:

private System.Windows.Forms.Label label1;

есть ли способ изменить значение по умолчанию на:

private System.Windows.Forms.Label _label1;

Это относится ко всем элементам управления, а не только к меткам, и да, они должны использоваться из кода.

спасибо,

Пламен

7 ответов


помимо создания собственного VS надстройки, которая следит за сгенерированным кодом и автоматически переименовывает его, нет никакого способа выполнить то, что вы хотите.


лично я считаю, что автоматический сгенерированный код должен быть исключен из любых руководящих принципов кодирования и так далее. В большинстве сценариев их можно игнорировать, если только в генераторе нет ошибки.

пожалуйста, обсудите с тем, кто написал это руководство по кодированию и спросите его.ее исключить сгенерированный код.


Я знаю, что это старый вопрос, но в последнее время я работаю с дизайнерами, и у меня есть решение для того, что вы хотите. Добавьте этот класс в проект:

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

а затем измените базовый класс формы с формы на BaseForm:

using System;

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

закройте все конструкторы форм перед перекомпиляцией проекта, а затем снова откройте его и попробуйте добавить элемент управления, его имя начнется с подчеркивания.


Я не думаю,что вы можете заставить дизайнера Visual Studio автоматически добавлять подчеркивание. Однако вы можете сделать процесс добавления подчеркивания менее болезненным. Сначала создайте объекты без подчеркивания, а затем переименуйте их с помощью функции рефакторинга. Просто наведите курсор на название поля (label1, в вашем случае) и нажмите F2 (или щелкните правой кнопкой мыши ⇒ рефакторинг ⇒ переименовать). Этот работает независимо от того, где в коде вы находитесь, все что вам нужно-это упоминание о label1. Поскольку вы, вероятно, будете писать код, который использует ваши элементы управления, вы, вероятно, будете ссылаться на поля в любом случае. Вы также можете нажать F12, чтобы перейти прямо к объявлениям, где вы фактически получите полный список всех ваших элементов управления; вы можете легко использовать F2 для переименования многих из них на одном дыхании.

кстати, я также использую F2 для переименования большинства автоматически сгенерированных имен обработчиков событий. Например, я ненавижу чтобы увидеть имена методов, такие как btnZoomIn_Click(). Я предпочитаю называть метод zoomIn() потому что это то, что он делает. Вместо Mainform_KeyPress() Я мог бы назвать это processKeyPress().


можно задать для параметра GenerateMember значение false.
Это не решает вашу проблему, но избегайте неправильного именования, когда вы не работаете с управлением вручную.


Resharper может применять соглашения об именах. Тогда остается только открыть .конструктор файлов и нажав alt + enter, введите несколько раз.


Как сказал BlueRaja, вы можете использовать Resharper. Затем вы можете использовать его очистку кода (Ctrl-E, C), однако это не работает с сгенерированными файлами, поэтому вам придется временно переименовать его. Я не на работе, поэтому я не могу проверить, есть ли возможность включить опцию для сгенерированных файлов где-нибудь.

обратите внимание, что вам придется перезапускать это каждый раз, когда файл восстанавливается.