Як я можу загортати текст у мітку за допомогою 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 Label - що, справедливо, є єдиною причиною використання мітки над TextBlock. Я дав відповідь на це запитання, в якому показано, як можна загортати етикетку (нижче)
PaulJ

24
JulianM - вони вже тільки для читання stackoverflow.com/questions/5073244/making-textblock-readonly ? Можливо, їх не було у 2011 році
Мартін Каподічі

12
@JulianM ви плутаєте TextBlockз TextBox? - TextBlockтільки для читання, оскільки WPF був названий кодом "Avalon".
BrainSlugs83

Мені потрібно було встановити Padding="5"відповідність прокладці в інших Labelелементах управління на формі. Дивіться відповідь Раджеша нижче.
Боб Кауфман

105

Часто ви не можете замінити Labelз , TextBlockяк ви хочете до використання в Targetвласність (яка встановлює фокус на цільової контроль при використанні клавіатури , наприклад ALT + C в прикладі коду нижче), так як це все це Labelдійсно пропонує більш TextBlock.

Однак, Labelвикористовує a 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 = "Обернути" Text = "Що б не було" /> </Label>
Девід

93

Я використав наступний код.

    <Label>
        <Label.Content>
            <AccessText TextWrapping="Wrap" Text="xxxxx"/>
        </Label.Content>
    </Label>

4
Це те, що найкраще працювало для мене. Просто, не потрібно використовувати інші елементи керування або додавати багато коду.
Yisela

3
@jeremychan, я зазначив би це як відповідь. Я щасливий, що прокрутився вниз і побачив цю відповідь.
Мехрад

Я повертаю свій голос за голос. Я спробував використовувати це, але це минуло моє "HorizontalAlignment =" Center "". На відміну від використання Textblock, не вдалося ...
Джек Мороз

4
Частина Label.Content не потрібна, оскільки все, що міститься в тезі мітки, автоматично вміст. Тим не менш, відмінна відповідь, оскільки вона зберігає можливість надавати ключі доступу, де всі рішення, що використовують TextBlock, не спрацьовують у цьому плані.
Роб Г

35

Ви можете помістити TextBlock всередині мітки:

<Label> 
  <TextBlock Text="Long Text . . . ." TextWrapping="Wrap" /> 
</Label> 

4
Мені подобається такий підхід, оскільки він дозволяє вашим стилям міток застосовуватись до цього текстового блоку, не створюючи додаткових стилів для 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 / ...
Юрій Schkatula

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";

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.