Как можно обернуть текст в метку с помощью WPF? - PullRequest
227 голосов
/ 16 февраля 2011

У меня есть TextBox и ярлык. После нажатия кнопки я выполняю следующий код:

 label1.Content = textbox1.Text; 

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

Ответы [ 10 ]

352 голосов
/ 16 февраля 2011

Элемент управления Label напрямую не поддерживает перенос текста в WPF. Вместо этого вы должны использовать TextBlock. (Конечно, вы можете поместить TextBlock внутри элемента управления Label, если хотите.)

Пример кода:

<TextBlock TextWrapping="WrapWithOverflow">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec adipiscing
    nulla quis libero egestas lobortis. Duis blandit imperdiet ornare. Nulla
    ac arcu ut purus placerat congue. Integer pretium fermentum gravida.
</TextBlock>
101 голосов
/ 01 марта 2012

Часто вы не можете заменить Label на TextBlock, поскольку хотите использовать свойство Target (которое устанавливает фокус на элемент управления target при использовании клавиатуры, например, ALT + C впример кода ниже), поскольку все это Label действительно предлагает за TextBlock.

Однако Label использует TextBlock для визуализации текста (если строка помещается в свойство Content, как это обычно и бывает);поэтому вы можете добавить стиль для TextBlock внутри Label следующим образом:

<Label              
    Content="_Content Text:"
    Target="{Binding ElementName=MyTargetControl}">
    <Label.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="TextWrapping" Value="Wrap" />
        </Style>
    </Label.Resources>
 </Label>
 <CheckBox x:Name = "MyTargetControl" />

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

84 голосов
/ 15 октября 2012

Я использовал следующий код.

    <Label>
        <Label.Content>
            <AccessText TextWrapping="Wrap" Text="xxxxx"/>
        </Label.Content>
    </Label>
32 голосов
/ 16 февраля 2011

Вы можете поместить TextBlock внутри метки:

<Label> 
  <TextBlock Text="Long Text . . . ." TextWrapping="Wrap" /> 
</Label> 
13 голосов
/ 05 января 2012

Чтобы обернуть текст в элемент управления меткой, измените шаблон метки следующим образом:

<Style x:Key="ErrorBoxStyle" TargetType="{x:Type Label}">
        <Setter Property="BorderBrush" Value="#FFF08A73"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Foreground" Value="Red"/>
        <Setter Property="Background" Value="#FFFFE3DF"/>
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="Padding" Value="5"/>
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="VerticalContentAlignment" Value="Top"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Label}">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true" CornerRadius="5" HorizontalAlignment="Stretch">

                        <TextBlock TextWrapping="Wrap" Text="{TemplateBinding Content}"/>
                    </Border>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
10 голосов
/ 16 февраля 2011

Вместо использования класса Label я бы рекомендовал использовать TextBlock .Это позволяет вам правильно установить TextWrapping .

Вы всегда можете сделать:

 label1.Content = new TextBlock() { Text = textBox1.Text, TextWrapping = TextWrapping.Wrap };

Однако, если все эти «метки» предназначены для отображения текста,используйте вместо него TextBlock.

4 голосов
/ 22 января 2016

Нам нужно установить какой-то элемент управления, который может переносить текст, например textblock / textbox

 <Label Width="120" Height="100" >
        <TextBlock TextWrapping="Wrap">
            this is a very long text inside a textblock and this needs to be on multiline.
        </TextBlock>
    </Label>
2 голосов
/ 12 июня 2018

Я использовал это для извлечения данных из базы данных MySql:

AccessText a = new AccessText();    
a.Text=reader[1].ToString();       // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;
2 голосов
/ 03 марта 2016
 <Label x:Name="datetimeofmsg" 
           HorizontalAlignment="Left" Margin="4.286,55,0,0" 
           VerticalAlignment="Top" Background="{x:Null}" 
           FontWeight="Bold" Width="61.714" Height="20" Foreground="White">
        <Label.Content>
            <AccessText TextWrapping="Wrap"/>
        </Label.Content>
    </Label>
2 голосов
/ 20 июля 2015

попробуйте использовать это

lblresult.Content = lblresult.Content + "prime are :" + j + "\n";
...