如何使用WPF将文本包装在标签中?


251

我有一个TextBox和一个标签。单击按钮后,我执行以下代码:

 label1.Content = textbox1.Text; 

我的问题是,如何启用标签的文本环绕?一行上可能显示太多文本,如果是这种情况,我希望它自动换行为多行。

Answers:


390

Label控件不直接支持WPF中的文本换行。您应该改用a 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
很好,但是如果您想使用Label的Target属性功能,那不是很好-公平地说,这可能是您在TextBlock上使用Label 的唯一原因。我提供了这个问题的答案,展示了如何在Label中包裹(下图)
PaulJ 2012年

24
JulianM-他们已经是只读的stackoverflow.com/questions/5073244/making-textblock-readonly吗?也许不是在2011年
马丁·卡波迪奇

12
@JulianM你混淆TextBlock使用TextBox?- TextBlock从WPF被命名为“ Avalon”以来一直是只读的。
BrainSlugs83 '16

我需要设置Padding="5"以匹配Label表单上其他控件中的填充。请参阅下面的Rajesh答案。
鲍勃·考夫曼

105

通常你不能代替LabelTextBlock,只要你想使用的Target属性(其将焦点设置于有针对性的使用在下面的示例代码键盘如ALT + C时控制),因为这是一个所有Label真正过报价TextBlock

但是,a 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添加的文本块在逻辑树中不存在,并且不会占用您的资源。
Gusdor

2
是的,这确实有效-在发布答案之前,我已经对其进行了测试。您说对了,因为目标元素不在逻辑树中,但在这里重要的是可视树。
PaulJ 2013年

11
这已经有几年历史了,但似乎不适用于VS2015。似乎有效的方法是在标签<Label>中使用TextBlock <TextBlock TextWrapping =“ Wrap” Text =“ Whatever” /> </ Label>
大卫

93

我用下面的代码。

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

4
这是最适合我的。简单,无需使用其他控件或添加很多代码。
伊塞拉

3
@jeremychan,我将其标记为答案。我很高兴我向下滚动并看到了这个答案。
Mehrad 2014年

我重新投票。我尝试使用此投票,但绕过了我的“ Horizo​​ntalAlignment =“ Center”“。与使用Textblock不同,它没有...
Jack Frost

4
Label.Content部分不是必需的,因为label标签中的所有内容都是自动内容。但是,这是一个很好的答案,因为它保留了提供访问密钥的功能,而使用TextBlock的所有解决方案均在此方面失败。
罗布G

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/...
尤里·Schkatula

12

建议不要使用Label类,而建议使用TextBlock。这使您可以适当地设置TextWrapping

您可以随时这样做:

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

但是,如果所有这些“标签”仅用于显示文本,请改用a 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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.