Вопрос

Как мы можем получить функциональность переноса слов для метки в Формы Windows?

Я поместил метку на панель и добавил немного текста для динамической маркировки.Но это превышает длину панели.Как я могу решить эту проблему?

Это было полезно?

Решение

Быстрый ответ: выключите Авторазмер .

Большая проблема в том, что метка не изменит свою высоту автоматически (только ширина). Чтобы сделать это правильно, вам нужно будет создать подкласс метки и включить логику вертикального изменения размера.

В основном вам нужно сделать в OnPaint:

<Ол>
  • Измерьте высоту текста (Graphics.MeasureString).
  • Если высота надписи не равна высоте текста, установите высоту и вернитесь.
  • Нарисуйте текст.
  • Вам также необходимо установить Флаг стиля ResizeRedraw в конструкторе.

    Другие советы

    На самом деле принятый ответ неоправданно сложен.

    Если вы установите метку в AutoSize, она будет автоматически расти с любым текстом, который вы в нее вставите. (Это включает вертикальный рост.)

    Если вы хотите сделать перенос слов на определенную ширину, вы можете установить свойство MaximumSize.

    myLabel.MaximumSize = new Size(100, 0);
    myLabel.AutoSize = true;
    

    Протестировано и работает.

    В моем случае (метка на панели) я установил label.AutoSize = false и label.Dock = Fill . И текст метки переносится автоматически.

    Плохие новости:свойства autowrap не существует.

    Хорошие новости:в конце туннеля есть свет!

    Вы могли бы выполнить это программно, чтобы изменять его размер динамически, но вот самое простое решение:

    • Выберите свойства метки
    • Автоматический размер = True
    • Максимальный размер = (Ширина, Высота) где Ширина = максимальный размер, который вы хотите, чтобы была метка, и Высота = сколько пикселей вы хотите обернуть

      Sample Properties

    От MSDN , Автоматически переносить текст в метку :

    using System;
    using System.Text;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class GrowLabel : Label {
        private bool mGrowing;
        public GrowLabel() {
            this.AutoSize = false;
        }
        private void resizeLabel() {
            if (mGrowing) 
                return;
            try {
                mGrowing = true;
                Size sz = new Size(this.Width, Int32.MaxValue);
                sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
                this.Height = sz.Height;
            }
            finally {
                mGrowing = false;
            }
        }
        protected override void OnTextChanged(EventArgs e) {
            base.OnTextChanged(e);
            resizeLabel();
        }
        protected override void OnFontChanged(EventArgs e) {
            base.OnFontChanged(e);
            resizeLabel();
        }
        protected override void OnSizeChanged(EventArgs e) {
            base.OnSizeChanged(e);
            resizeLabel();
        }
    }
    

    Мне нужно было найти быстрое решение, поэтому я просто использовал TextBox с этими свойствами:

    var myLabel = new TextBox
                        {
                            Text = "xxx xxx xxx",
                            WordWrap = true,
                            AutoSize = false,
                            Enabled = false,
                            Size = new Size(60, 30),
                            BorderStyle = BorderStyle.None,
                            Multiline =  true,
                            BackColor =  container.BackColor
                        };
    

    Выберите лучший вариант, основываясь на ответе @hypo

    public class GrowLabel : Label {
        private bool mGrowing;
        public GrowLabel() {
            this.AutoSize = false;
        }
        private void resizeLabel() {
            if (mGrowing)
                return;
            try {
                mGrowing = true;
                int width = this.Parent == null ? this.Width : this.Parent.Width;
    
                Size sz = new Size(this.Width, Int32.MaxValue);
                sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
                this.Height = sz.Height + Padding.Bottom + Padding.Top;
            } finally {
                mGrowing = false;
            }
        }
        protected override void OnTextChanged(EventArgs e) {
            base.OnTextChanged(e);
            resizeLabel();
        }
        protected override void OnFontChanged(EventArgs e) {
            base.OnFontChanged(e);
            resizeLabel();
        }
        protected override void OnSizeChanged(EventArgs e) {
            base.OnSizeChanged(e);
            resizeLabel();
        }
    }
    

    int width = this.Parent == null? this.Width: this.Parent.Width; это позволяет использовать метку автоматического увеличения при присоединении к родителю, например, панель.

    this.Height = sz.Height + Padding.Bottom + Padding.Top; здесь мы позаботимся о заполнении сверху и снизу.

    <Ол>
  • Поместите ярлык на панель
  • Обработайте событие ClientSizeChanged для панели, сделав метка заполнить пробел:

    private void Panel2_ClientSizeChanged(object sender, EventArgs e)
    {
        label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
    }
    
  • Установите для Авторазмера для метки значение true

  • Установите для Dock метки значение Fill
  • Не уверен, что он подойдет для всех вариантов использования, но я часто использую простой трюк, чтобы получить поведение обтекания: поместите свою Label с AutoSize = false в 1x1 TableLayoutPanel , который позаботится о размере Label .

    Установите для свойства AutoEllipsis значение TRUE, а для свойства AutoSize - значение FALSE.

     введите описание изображения здесь

     введите описание изображения здесь

    Если ваша панель ограничивает ширину вашей метки, вы можете установить свойство привязки метки на Left, Right и установить AutoSize на true. Концептуально это аналогично прослушиванию события Panel SizeChanged и обновлению MaximumSize метки до нового размера (((Control) отправителя) .Size.Width, 0) в соответствии с предыдущим ответом . Каждая сторона, указанная в свойстве Anchor, хорошо привязана к соответствующей внутренней стороне содержащего элемента управления. Таким образом, перечисление двух противоположных сторон в Anchor эффективно устанавливает размер элемента управления. Привязка к левому и правому краям устанавливает свойство Control's Width, а привязка к верхнему и нижнему элементам устанавливает его свойство Height.

    Это решение, как C #:

    label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
    label.AutoSize = true;
    

    Если вы действительно хотите установить ширину метки независимо от содержимого, я считаю, что самый простой способ заключается в следующем:

    • Установите автоматический размер true
    • Установите максимальную ширину такой, какой вы хотите ее видеть
    • Установите одинаковую минимальную ширину

    Теперь метка имеет постоянную ширину, но она автоматически изменяет свою высоту.

    Затем для динамического текста уменьшите размер шрифта.При необходимости используйте этот фрагмент в подразделе, где задан текст метки:

    If Me.Size.Height - (Label12.Location.Y + Label12.Height) < 20 Then
        Dim naam As String = Label12.Font.Name
        Dim size As Single = Label12.Font.SizeInPoints - 1
        Label12.Font = New Font(naam, size)
    End If
    

    Это помогло мне в моей форме под названием InpitWindow: В Designer for Label:

    AutoSize = true;
    Achors = Top, Left, Right.
    
    private void InputWindow_Shown(object sender, EventArgs e) {
        lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left - btOK.Margin.Right -
            lbCaption.Margin.Right - lbCaption.Margin.Left, 
            Screen.GetWorkingArea(this).Height / 2);
        this.Height = this.Height + (lbCaption.Height - btOK.Height - btCancel.Height);
        //Uncomment this line to prevent form height chage to values lower than initial height
        //this.MinimumSize = new Size(this.MinimumSize.Width, this.Height);
    }
    //Use this handler if you want your label change it size according to form clientsize.
    private void InputWindow_ClientSizeChanged(object sender, EventArgs e) {
        lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left * 2 - btOK.Margin.Right * 2 -
            lbCaption.Margin.Right * 2 - lbCaption.Margin.Left * 2,
            Screen.GetWorkingArea(this).Height / 2);
    }
    

    Весь код моей формы

    Если размеры кнопки нужно оставить без изменений:

    myButton.Text = "word\r\nwrapped"
    

    Простой ответ для этой проблемы - изменить свойство DOCK метки. Это "НЕТ" по умолчанию.

    Используйте style = " overflow: Scroll " в метке, как в приведенном ниже HTML-коде. Это добавит полосу прокрутки в метку на панели.

    <asp:Label
        ID="txtAOI"
        runat="server"
        style="overflow:Scroll"
        CssClass="areatext"
        BackColor="White"
        BorderColor="Gray"
        BorderWidth="1"
        Width = "900" ></asp:Label>
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top