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


251

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

 label1.Content = textbox1.Text; 

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

Ответы:


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


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>

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
 <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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.