Как установить управляющие свойства в конструкторе (проблемы с конструктором) - PullRequest
0 голосов
/ 22 февраля 2012

Я пытаюсь унаследовать от ToolStripLabel:

public class SeparatorLabel : ToolStripLabel
{
    public SeparatorLabel() : base()
    {
        Margin = new Padding(5, 0, 5, 0);
        Text = "ABC";
    }
}

Однако, когда я помещаю такой элемент управления в форму, свойство Text берется из значения, введенного в сетку свойств дизайнера.

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

Вопрос - Какова стандартная практика для достижения такого поведения при наследовании от существующих элементов управления?

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

public class SeparatorLabel : ToolStripLabel
{
    public SeparatorLabel() : base()
    {
        Margin = new Padding(5, 0, 5, 0);
        base.Text = "ABC";
    }

    [Browsable(false)]
    public override string Text
    {
        get
        {
            return base.Text;
        }
        set { }
    }
}

Это работает, но я не уверен, что это лучшая практика. Есть ли какой-нибудь более традиционный способ добиться того, что мне нужно?

1 Ответ

0 голосов
/ 22 февраля 2012

Ваш пример не компилируется, так как ваш конструктор отличается от вашего класса.

Вы также можете посмотреть атрибут DesignerSerializationVisibility и установить его на Hidden.

public SeparatorLabel() {
  base.Margin = new Padding(5, 0, 5, 0);
}

[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new Padding Margin {
  get { return base.Margin; }
  set {
    throw new Exception("This property is read only.");
  }
}
...