2013-06-21 2 views
1

фона:странно этикетки Авторазмер вопрос о TableLayoutPanel размер

У меня есть TableLayoutPanel помещенный в UserControl, который затем помещают в SplitContainer. Строки добавляются программно. TableLayoutPanel привязан к началу | Влево | Вправо, поэтому после добавления строк его высота пересчитывается и расширяется вниз.

Внутри TableLayoutPanel есть 2 колонки. Размер первого столбца - Абсолютный, размер второго столбца - AutoSize

В каждой ячейке есть этикетка. Все метки во второй колонке, определяются следующим образом:

Label vName = new Label(); 
    vName.AutoSize = true; 
    vName.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom; 
    vName.Margin = new Padding(3); 
    vName.TextAlign = ContentAlignment.MiddleLeft; 
    vName.Name = "controlName"; 
    vName.Text = "Some text here"; 
    vName.DoubleClick += new EventHandler(vName_DoubleClick); 
    vName.Dock = DockStyle.None; 

Проблема:

Обычно все работает хорошо, этикетки размер и все, кроме одного странного сценария, за исключением:

  1. Текст метки - это что-то вроде «immoballizes устройство (33.33%)», ширина столбца TableLauoutPanel2 устанавливается точно так, что весь текст показан в одной строке.
  2. изменение разветвителя расстояние от одного пикселя и UserControl изменяются: ширина уменьшается, метка должна изменить размер и текст в метке должен обернуть
  3. Метка не изменяются, а вторая строка текста не отображается, это также, вероятно, не обернуть (было бы изменить в текстовом месте в метке, если это имело место)
  4. изменения разветвитель расстояние от одного пикселя снова и UserControl изменяется: ширина уменьшается дополнительно
  5. Этикетка изменяет все в порядке и все текст показан, завернутый

То же самое происходит, когда ширина таблицы TableLayoutPanel увеличивается, но всегда, только если существует разница в одном пикселе (между обертыванием/без обтекания текста).

Кроме того, изменение док и/или анкера и/или BorderStyle свойства этикеток не работает (я, вероятно, перепробовал все возможные комбинации ...)

Эта фотография иллюстрирует вопрос немного: enter image description here

+0

Я заметил, как вы установите 'Anchor' и левый' Dock = DockStyle.None' ... есть причина? Док должен помочь в этом. – DonBoitnott

+0

Я пробовал это в начале. Не имеет никакого значения. – Arie

+0

Вы задаете противоречивые инструкции механизма компоновки. Вы говорите, что метка должна автоматически изменять размер с помощью AutoSize = true. Но тогда также скажите, что он должен наблюдать размер контейнера с свойством Anchor. Это имеет тенденцию вызывать бистабильную компоновку, поскольку есть два * решения для запроса макета.Вероятно, больше в вашем случае, потому что вы также сделали автозагрузку колонки. Вам нужно избавиться от этой двусмысленности. Начните с привязки якоря. –

ответ

1

По-видимому, это проблема с меткой: при автосохранении она не корректно считывала текст, а иногда была разница в одном пикселе. Однако я нашел странное обходное решение, если кто-то знает что-то лучше, пожалуйста, просветите меня.

Таким образом, текст в моих лейблов правильно оборачивает каждый раз, и все autosized правильно:

void tableLayoutPanel1_Resize(object sender, EventArgs e) 
     { 
      float fWidth = tableLayoutPanel1.GetColumnWidths()[1]; 
      foreach (Control ctr in tableLayoutPanel1.Controls) 
      { 
       if (ctr is Label && ctr.Name.Contains("vName_")) 
       { 
        // -7 for margins 
        Size s = TextRenderer.MeasureText(ctr.Text, ctr.Font, new Size((int)fWidth - 7,1000), 
         TextFormatFlags.VerticalCenter 
         | TextFormatFlags.Left 
         | TextFormatFlags.NoPadding 
         | TextFormatFlags.WordBreak); 
        if(!ctr.MaximumSize.Equals(s)) 
         ctr.MaximumSize = new Size(s.Width, s.Height); 
       } 
      } 
     }