Я работаю над созданием настраиваемого элемента управления, который будет использоваться в нашем интерфейсе CRM. Сам элемент управления ничего особенного, он просто обертывает две метки, текстовые изменения и кнопку в один элемент управления. (Контроль действует только как обертка, немного длинный, но, к сожалению, наш единственный вариант из-за различных ограничений)Схема управления Winforms во время выполнения
Я бы неплохо было дать контроль над свойством Font и ForeColor, что изменит шрифт и Цвет этикеток. Изменение размера шрифта означает, что относительное положение текстовых полей должно быть изменено, чтобы сохранить все в строю. Нет проблем.
Я инкапсулировал логику компоновки в методе UpdateLayout, который вызывается на установочном аксессуре свойства Font, и все работает красиво во время разработки, однако во время выполнения шрифт ярлыков верен, но макет текстовые поля и кнопка все еще находятся в позиции по умолчанию, поэтому метки перекрываются.
Что мне не хватает для обновления позиции элементов управления на этапе инициализации во время выполнения? Я пробовал вызывать метод UpdateLayout() как из Initialize, так и из конструктора элемента управления, увы, безрезультатно.
Я пропустил что-то очевидное здесь?
EDIT:
В соответствии с просьбой, я взбитыми быстрый тест. Мой тестовый контроль выглядит так (не включая код конструктора):
public partial class TestControl : UserControl
{
private Font _font;
[Browsable(true)]
public override Font Font
{
get
{
return this._font ?? SystemFonts.DefaultFont;
}
set
{
this._font = value;
this.DoLayout();
}
}
private void DoLayout()
{
this.label1.Font = this._font;
this.Size = new Size(label1.Width + textBox1.Width + 10,
label1.Height >= textBox1.Height ? label1.Height : textBox1.Height);
this.textBox1.Location = new Point(label1.Location.X + 5 + label1.Width, 1);
this.Update();
}
public TestControl()
{
InitializeComponent();
}
protected override void OnLayout(LayoutEventArgs e)
{
base.OnLayout(e);
DoLayout();
}
}
Это прекрасно работает во время разработки, но во время выполнения, в меньшей степени ...
EDIT2:
Так приведенный выше код не совсем точно отражает проблему, однако я попытался предложить Jogy переопределить метод OnLayout, и вот, он работает!
Я относительно новичок в пользовательских элементах управления, поэтому ошибка новичков с моей стороны. Это определенно будет посвящено долговременной памяти.
Вы можете поделиться некоторыми кодами? –
Вы пробовали переопределить метод OnLayout и вызвать UpdateLayout там? – Jogy
Обычно я пытаюсь разрешить позиционирование и размер элементов управления в пользовательских или пользовательских элементах управления, применяя a) свойство Dock на элементах управления или b) используя Anchors. Но поскольку Патрик предлагает некоторый код того, как вы настраиваете/инициализируете элементы управления и как выполняете обновление макета, было бы удобно. – Arjo