2016-11-02 4 views
2

У меня есть WinForms-приложение, где я хочу, чтобы добавить UserControls динамически стыковки к вершине:Autosizing панели по содержанию текста

this.Controls.Clear(); 
this.Controls.Add(myCustomControl(){Title="first", content="first text", Dock=DockStyle.Top}); 
this.Controls.Add(myCustomControl(){Title="second", content="very long text, where......", Dock=DockStyle.Top}); 

Теперь myCostumControl [YELLOW] является UserControl со следующим содержанием:

TopTitle [PINK]: A Label, docked to the top 
BottomContent [GREEN]: A Panel, Fills out the rest of the Control below the TopTitle (Dockstyle Fill) 
TextContent [BLUE]: A multiline Textbox, docked (fill) within the Panel. 

Так это выглядит следующим образом:

enter image description here

Теперь мне нужно добиться того, что высота из myCustomControl соответствует текстовому содержимому «TextContent» - TextBox, поэтому я могу складывать несколько элементов управления. Поэтому, если в нем есть только «Hello World», высота должна быть небольшой, если я вложу в нее EULA Windows, она должна быть очень длинной.

Я уже пробовал испортить все «AutoSize» -properties. Я мог бы набраться сил, но текстовое поле либо полностью исчезло, либо не было никакого эффекта.

Я также попытался изменить размеры Textbox по изменению:

Size size = TextRenderer.MeasureText(txtContent.Text, txtContent.Font); 
txtContent.Height = size.Height; 

Нет успеха, либо

+0

Очевидно, что вы не можете использовать 'DockStyle.Fill' и' AutoSize' одновременно для одного и того же элемента управления. – Phil1970

+0

Я также пробовал с DockStyle.Top для TextBox. Не работает, либо –

+0

Кстати, 'TextBox' не имеет никакого свойства' AutoSize' ... Итак, как вы его автоматизируете? Пользовательский код? – Phil1970

ответ

1

Для того, чтобы ваш композиционное управление авто-размер, выполните следующие параметры:

  • Добавить Label для управления пользователем и установить AutoSize этикетку ложь и установить его высоту на соответствующую высоту и установить его Dock к началу ,
  • Добавить пользователя TextBox для управления пользователем и установить его Dock на Fill.
  • переопределение SetBoundsCore и вычислить предпочтительный размер контроля:

    protected override void SetBoundsCore(int x, int y, int width, int height, 
        BoundsSpecified specified) 
    { 
        var flags = TextFormatFlags.WordBreak | TextFormatFlags.NoPrefix; 
        var proposedSize = new Size(width, int.MaxValue); 
        var size = TextRenderer.MeasureText(textBox1.Text, textBox1.Font, 
         proposedSize, flags); 
        height = Math.Max(size.Height, textBox1.Font.Height) + label1.Height + 5; 
        base.SetBoundsCore(x, y, width, height, specified); 
    } 
    
  • Ручка TextChanged событие TextBox, чтобы обновить размер управления при изменении текста содержания:

    void textBox1_TextChanged(object sender, EventArgs e) 
    { 
        SetBoundsCore(Left, Top, Width, Height, BoundsSpecified.Size); 
    } 
    

здесь результат:

enter image description here

+0

Вы также можете взглянуть на [Элемент управления пользователя с атрибутом auto-height] (http://stackoverflow.com/questions/38203411/user-control-with-auto-height-property). –

+0

Дайте мне знать, если у вас есть вопросы по поводу ответа :) –

0

Если вы хотите myCustomControl быть autosized, то Obvioulsy, вы не можете использовать заполнить стыковку для любых дочерних элементов управления, как стыковка установите размер дочернего элемента в соответствии с размером родителя, и вы хотите, чтобы размер родителя был настроен в соответствии с размером ребенка.

Так что вы должны либо использовать макет таблицы, либо раскладку для ребенка. Если вы используете таблицу, то для строк, которые должны адаптироваться, вам необходимо использовать автоматический размер.

Затем весь макет можно настроить на автоматический размер и должен быть состыкован сверху (или, возможно, привязан).

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

+0

Очевидно, что отдельные элементы управления должны иметь свойство «AutoSize» ... так что решение не будет работать, если дочерний элемент управления является «TextBox». – Phil1970

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