Как мне обернуть текст в метку с помощью WPF?

251

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

 label1.Content = textbox1.Text; 

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

jeremychan
источник

Ответы:

390

Элемент 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>
Коди Грей
источник
30
... и настроено IsReadOnly="true"имитировать ярлык :)
JulianM
7
Это хорошо, но не в том случае, если вы хотите использовать свойство свойства Target метки - что справедливо, вероятно, единственная причина, по которой вы будете использовать метку вместо TextBlock. Я дал ответ на этот вопрос, который показывает, как получить упаковку в
ярлыке
24
JulianM - они уже только для чтения stackoverflow.com/questions/5073244/making-textblock-readonly ? Может быть, они не были в 2011 году
Мартин Каподичи
12
@JulianM ты путаешь TextBlockс TextBox? - TextBlockДоступны только для чтения, поскольку WPF имел кодовое имя "Авалон".
BrainSlugs83
Мне нужно было установить Padding="5"соответствие с отступом в других моих Labelэлементах управления в форме. Смотрите ответ Раджеша ниже.
Боб Кауфман
105

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

Тем не менее, a 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то же время имея возможность переносить текст.

PaulJ
источник
3
Это на самом деле работает? Из того, что я видел, текстовый блок, который добавляет WPF, не существует в логическом дереве и не будет забирать ваш ресурс.
Гусдор
2
Да, это работает - я проверил это, прежде чем опубликовать свой ответ. Вы правы в том, что целевые элементы находятся не в логическом дереве, а здесь имеет значение визуальное дерево.
PaulJ
11
Это несколько лет, но, похоже, это не работает с VS 2015. То, что, кажется, работает, это использование TextBlock в метке <Label> <TextBlock TextWrapping = "Wrap" Text = "Независимо" /> </ Label>
Дэвид
93

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

    <Label>
        <Label.Content>
            <AccessText TextWrapping="Wrap" Text="xxxxx"/>
        </Label.Content>
    </Label>
bbdaffy
источник
4
Это то, что сработало лучше для меня. Просто, не нужно использовать другие элементы управления или добавлять много кода.
Yisela
3
@jeremychan, я бы отметил это как ответ. Я счастлив, что прокрутил вниз и увидел этот ответ.
Мехрад
Я вернул свой голос. Я пытался использовать это, но он обошел мой "HorizontalAlignment =" Center "". В отличие от использования Textblock, это не ...
Джек Фрост
4
Часть Label.Content не нужна, так как все, что находится внутри тега label, автоматически содержит содержимое. Тем не менее, отличный ответ, поскольку он сохраняет возможность предоставлять ключи доступа, когда все решения, использующие TextBlock, терпят неудачу в этом отношении.
Роб Г
35

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

<Label> 
  <TextBlock Text="Long Text . . . ." TextWrapping="Wrap" /> 
</Label> 
Адриан Фачу
источник
4
Мне нравится этот подход, потому что он позволяет вашим стилям Label применять к этому текстовому блоку без необходимости создавать дополнительные стили для TextBlock.
Соггер
15

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

<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>
Раджеш Р. Найк
источник
Приложение: если вам нужно добавить перенос текста или другие специфичные для TextBlock свойства, вы можете смешать их со следующим рецептом stackoverflow.com/questions/3970285/…
Юрий Сккатула
12

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

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

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

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

Рид Копси
источник
В итоге я использовал этот метод для заполнения содержимого динамической метки. Кажется, самый простой и чистый метод. Я полагаю, вы могли бы включить строку в определение label1, то есть <br/>Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
dashrader
4

Нам нужно поставить какой-то элемент управления, который может переносить текст, например, 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

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

lblresult.Content = lblresult.Content + "prime are :" + j + "\n";
RathapongPumpo
источник
2
 <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

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

AccessText a = new AccessText();    
a.Text=reader[1].ToString();       // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;
DiogoA.
источник