2014-09-12 5 views
0

Я работаю над созданием настраиваемого элемента управления, который будет использоваться в нашем интерфейсе 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, и вот, он работает!

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

+1

Вы можете поделиться некоторыми кодами? –

+0

Вы пробовали переопределить метод OnLayout и вызвать UpdateLayout там? – Jogy

+1

Обычно я пытаюсь разрешить позиционирование и размер элементов управления в пользовательских или пользовательских элементах управления, применяя a) свойство Dock на элементах управления или b) используя Anchors. Но поскольку Патрик предлагает некоторый код того, как вы настраиваете/инициализируете элементы управления и как выполняете обновление макета, было бы удобно. – Arjo

ответ

1

Переопределите способ OnLayout() и позвоните по номеру UpdateLayout().

0

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

public override Font Font 
{ 
    get { return this.label1.Font; } 
    set 
    { 
     this.label1.Font = value; 
     // Additional code to update related controls. 
    } 
} 

быть также известно, что декларация

private Font _font; 

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

this.label1.Font = this.Font; 
+0

Я знаю, что я ответил на этот вопрос, как только ответил, но просто быстро заметил. Будет ли null не сбрасываться, объединив _font в Font Get accessor? - Nevermind, я не использовал публичную собственность в приведенном выше примере. * Doh * – Ahhhhbisto

Смежные вопросы