Как мне установить метку моего UserControl во время разработки? - PullRequest
8 голосов
/ 08 ноября 2011

Вот настройка: я создал пользовательский элемент управления MyUserControl.На этом элементе управления находится простая метка.Когда я помещаю новый экземпляр этого элемента управления в форму, я бы хотел, чтобы метка была именем элемента управления.Например, если это первый экземпляр элемента управления, VStudio автоматически устанавливает его имя как «myUserControl1».Я бы просто хотел, чтобы на этикетке было написано «myUserControl1».Если это пятый элемент управления, VStudio назовет его myUserControl5.Я бы хотел, чтобы ярлык изменился соответствующим образом ... но только если он еще не установлен.После того, как я установил для него надпись «Метка», его следует оставить в покое.

Я думал, что это будет легко.В конструкторе установите label1.Text = this.Name.Но потом я понял, при создании экземпляра this.Name это просто MyUserControl.VisualStudio и метод CONTAINING InitializeComponent () пока не назвали его.

Ах!Я просто переопределю поле «Имя».Когда он будет установлен, проверьте DesignMode и обновите метку! ... но я не могу переопределить имя.Это не виртуально или абстрактно.Я могу использовать «new», чтобы вызвать его, но тогда он никогда не сработает, что приведет к поражению цели.

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

Ответы [ 3 ]

2 голосов
/ 08 ноября 2011

Как насчет переопределения метода OnLoad , который вызывает событие Load ?

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

1 голос
/ 11 ноября 2011

Итак, вот окончательный ответ:

Согласно предложению Ганса, для этого требовался ControlDesigner. Я создал простой дизайнер, который будет взаимодействовать с некоторыми внутренними свойствами, и я заставил его работать. Но вот в чем подвох: это что-то вроде хака. Кажется, не существует ни одного поля со значением, которое я ищу, поэтому мне пришлось сделать .ToString() для объекта, а затем проанализировать первый раздел. Я подумал, что это примерно так же чисто, как и собирается.

public class MyControlDesigner : ControlDesigner
{
    public MyControlDesigner()
    {
    }


    public override void InitializeNewComponent(IDictionary defaultValues)
    {
        base.InitializeNewComponent(defaultValues);

        MyControl control1 = this.Component as MyControl;
        control1.LabelText = control1.ToString().Split(" ".ToCharArray())[0];
    }
}

Затем в верхней части MyControl я просто добавил новый атрибут:

[DesignerAttribute(typeof(MyControlDesigner))]
public partial class MyControl : UserControl
{
    ...

    // Using the property "Text" Causes Visual Studio to crash!!!
    public string LabelText
    {
        get { return label1.Text; }
        set { label1.Text = value; }
    }

    ...
}

Как видите, это было не очень сложно, но это немного хакерство. Элемент управления заблокировал IDE, когда я попытался переопределить «Текст». Не знаю почему, но когда я назвал его «LabelText», он работал отлично.

0 голосов
/ 08 ноября 2011

Редактировать файл конструктора. Например, скажем, у меня есть форма с именем Form1. Итак, я бы имел Form1.cs, Form1.resx и Form1.Designer.cs в визуальной студии. При открытии Form1.Designer.cs вы увидите это:

   #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>

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

Вот пример редактирования, я устанавливаю текст label3 для имени label1:

            // 
            // label3
            // 
            this.label3.AutoSize = true;
            this.label3.Location = new System.Drawing.Point(371, 146);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(35, 13);
            this.label3.TabIndex = 10;
            this.label3.Text = "label3";
            //My Edit
            this.label3.Text = this.label1.Name;

Теперь в конструкторе форм в Visual Studio я вижу, что label3 имеет имя label1:

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...