Как можно предотвратить «стандартные» значения в переопределенных элементах управления WinForm?

StackOverflow https://stackoverflow.com/questions/637222

  •  10-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь понять и понять, что и как делает C #. Я исторически являюсь разработчиком Visual Foxpro (VFP), и несколько избалован годами визуального наследования, создавая собственный базовый уровень пользовательских элементов управления для использования в приложениях.

Пытаясь изучить параллели в C #, я застрял на чем-то. Скажем, я получил свой собственный элемент управления меткой (элемент управления является подклассом метки), определенный со шрифтом «Arial», 10 точек. Затем в любой форме, к которой я ее добавляю, Дизайнер автоматически предварительно заполнит некоторые значения свойств, которые можно увидеть в " Designer.cs " часть класса Form.

this.LabelHdr2.AutoSize = true;
this.LabelHdr2.Font = new System.Drawing.Font("Arial", 14F, System.Drawing.FontStyle.Bold);
this.LabelHdr2.ForeColor = System.Drawing.Color.Blue;
this.LabelHdr2.Location = new System.Drawing.Point(150, 65);
this.LabelHdr2.Name = "LabelHdr2";
this.LabelHdr2.Size = new System.Drawing.Size(158, 22);
this.LabelHdr2.TabIndex = 5;
this.LabelHdr2.Text = "LabelHdr2";

Я хочу, чтобы такие объекты, как «Шрифт», «Цвет», «Размер», «Авторазмер», не генерировались каждый раз, когда элемент управления помещался в форму. Если позже я решу изменить шрифт с "Arial" 10, чтобы "Tahoma" 11, мне нужно будет вернуться ко всем формам (и любым другим настраиваемым элементам управления) и отредактировать их для изменения.

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

В C # я должен вернуться и изменить каждую форму, чтобы она распознавалась новыми / обновленными значениями класса ...

Есть ли разумный способ избежать этого?

Это было полезно?

Решение

Вот простое решение с использованием ReadOnlyAttribute в производном классе.

class MyLabel : Label
{
    [ReadOnly(true)]
    public override Font Font
    {
        get { return new Font(FontFamily.GenericMonospace, 10); }
        set { /* do nothing */ }
    }
}

ReadOnlyAttribute отключит редактирование свойств в конструкторе VS.NET.

Другие советы

Вместо использования " ReadOnlyAttribute " попробуйте использовать " DefaultValueAttribute & Quot; вместо. Если я правильно помню, дизайнер не должен создавать код для установки свойства, если текущее значение совпадает со значением, хранящимся в " DefaultValueAttribute ".

Попробуйте добавить атрибут ReadOnly в свойства ваших производных классов:

[ReadOnly(true)]
public override Font Font
{
    get{ // Your Implementation Here }
    set{ // Don't really care,do you? }
}

Атрибут ReadOnlyAttribute должен обеспечивать поведение ReadOnly во время разработки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top