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

296

我有一个TextBox和一个Label。点击一个按钮后,我执行以下代码:

 label1.Content = textbox1.Text; 

我的问题是,如何启用标签的文本换行?可能会有过多的文本无法在一行上显示,如果是这种情况,我希望它能自动换行到多行。

10个回答

451

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>

8
这个方案是可行的,但如果你想使用Label的Target属性特性,这就不行了——而这可能是你选择Label而非TextBlock的 唯一 原因。我已经提供了一个回答来展示如何在Label中实现换行(如下所示)。 - PaulJ
25
JulianM-他们已经是只读的了 https://dev59.com/fG445IYBdhLWcg3wBl2J?也许在2011年时不是。 - Martin Capodici
16
@JulianM,你是不是把TextBlockTextBox混淆了?自从WPF代号为"Avalon"以来,TextBlock一直都是只读的。 - BrainSlugs83
我需要设置 Padding="5" 以匹配表单上其他 Label 控件的填充。请参见下面的Rajesh的答案。 - Bob Kaufman

119
通常情况下,你不能像使用 TextBlock 一样替换 Label,因为你想要使用 Target 属性(当使用键盘时将焦点设置到目标控件,例如在下面的示例代码中按下 ALT+C),而这就是 Label 相对于 TextBlock 的优势之一。
然而,Label 使用 TextBlock 渲染文本(如果一个字符串被放置在 Content 属性里面的话,通常情况下都是这样);因此,你可以在 Label 内部添加一个 TextBlock 样式,如下所示:
<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
14
这篇文章有几年历史了,但似乎在使用VS 2015时无法正常工作。看起来可行的解决方法是在标签中使用文本块(TextBlock):<Label> <TextBlock TextWrapping="Wrap" Text="Whatever" /> </Label> - BeanFlicker

118

我使用了以下代码。

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

7
这是对我最好的解决方案。它很简单,无需使用其他控件或添加太多代码。 - Yisela
5
@jeremychan,我会把这个标记为答案。我很高兴向下滚动并看到了这个答案。 - Mehrad
我取消了我的点赞。我尝试使用这个,但它绕过了我的“HorizontalAlignment=”Center“”。与使用Textblock不同,它没有... - Jack Frost
6
Label标签中的Label.Content部分是不必要的,因为标签内的任何内容都会自动成为内容。尽管如此,这是一个很好的答案,因为它保留了提供访问键的能力,而所有使用TextBlock的解决方案在这方面都失败了。 - Rob G

40
你可以在标签内放置一个文本块(TextBlock):
<Label> 
  <TextBlock Text="Long Text . . . ." TextWrapping="Wrap" /> 
</Label> 

4
我喜欢这种方法,因为它允许标签样式应用于这个 TextBlock 上,而无需为 TextBlock 创建额外的样式。 - Sogger

19

要在标签控件中包装文本,请按以下方式更改标签的模板:

<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特定属性,可以使用以下配方进行混合https://dev59.com/eW865IYBdhLWcg3wIa_M - Yury Schkatula
小心这个答案。一个普通的标签可以有一个控件作为其内容,但这个标签不允许这样做。 - undefined

13

建议使用TextBlock类而不是Label类。这样可以适当设置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

6
我们需要一个可以像文本框/文本块一样换行的控件。
 <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;

2

尝试使用这个

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接