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

时间:2011-02-16 06:08:48

标签: c# .net wpf label textwrapping

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

 label1.Content = textbox1.Text; 

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

10 个答案:

答案 0 :(得分:346)

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>

答案 1 :(得分:101)

您通常无法使用Label替换TextBlock,因此您需要使用Target属性(在使用时将焦点设置为目标控件键盘,例如下面的示例代码中的ALT + C),因为Label实际上提供了超过TextBlock的{​​{1}}。

但是,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的功能,同时还可以包装文本。

答案 2 :(得分:82)

我使用了以下代码。

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

答案 3 :(得分:32)

您可以在标签内放置一个TextBlock:

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

答案 4 :(得分:13)

要在标签控件中包装文本,请按如下所示更改标签模板:

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

答案 5 :(得分:10)

我建议使用TextBlock而不是使用Label类。这允许您适当地设置TextWrapping

你总是可以这样做:

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

但是,如果所有这些“标签”用于显示文字,请使用TextBlock代替。

答案 6 :(得分: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>

答案 7 :(得分:2)

尝试使用此

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

答案 8 :(得分: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>

答案 9 :(得分:2)

我用它从MySql数据库中检索数据:

AccessText a = new AccessText();    
a.Text=reader[1].ToString();       // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;