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

jer*_*han 235 .net c# wpf label word-wrap

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

 label1.Content = textbox1.Text; 
Run Code Online (Sandbox Code Playgroud)

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

Cod*_*ray 362

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>
Run Code Online (Sandbox Code Playgroud)

  • ...并设置`IsReadOnly ="true"`以模仿标签:) (25认同)
  • JulianM - 他们已经只读过http://stackoverflow.com/questions/5073244/making-textblock-readonly?也许他们不是在2011年 (21认同)
  • @JulianM你把`TextBlock`与`TextBox`混淆了吗? - "TextBlock"是只读的,因为WPF的代码名为"Avalon". (11认同)
  • 这很好,但是如果你想使用Label的Target属性功能则不行 - 这可能只是你在TextBlock上使用Label的*唯一原因.我已经提供了这个问题的答案,显示了如何在标签中包装(下面) (7认同)

Pau*_*ulJ 104

通常你不能代替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" />
Run Code Online (Sandbox Code Playgroud)

这样你就可以保持a的功能,Label同时也可以包装文本.

  • 这已经有几年了,但这似乎不适用于VS 2015.似乎有用的是在标签中使用TextBlock <Label> <TextBlock TextWrapping ="Wrap"Text ="Whatever"/> </ Label> (9认同)
  • 这应该标记为答案. (6认同)
  • 这实际上有用吗?从我所看到的WPF添加的文本块在逻辑树中不存在,并且不会获取您的资源. (3认同)
  • 是的,这确实有效 - 我在发表答案之前对其进行了测试.你是正确的,因为目标元素不在逻辑树中,但它是在这里重要的可视树. (2认同)

小智 87

我使用了以下代码.

    <Label>
        <Label.Content>
            <AccessText TextWrapping="Wrap" Text="xxxxx"/>
        </Label.Content>
    </Label>
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说最有效.简单,无需使用其他控件或添加太多代码. (4认同)
  • @jeremychan,我会把这个标记为答案.我很高兴我向下滚动并看到了这个答案. (3认同)
  • Label.Content部分不是必需的,因为label标签中的所有内容都是自动内容。但是,这是一个很好的答案,因为它保留了提供访问密钥的功能,而使用TextBlock的所有解决方案均在此方面失败。 (2认同)

Adr*_*ciu 32

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

<Label> 
  <TextBlock Text="Long Text . . . ." TextWrapping="Wrap" /> 
</Label> 
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这种方法,因为它允许您的Label样式应用于此文本块,而无需为TextBlock创建其他样式. (3认同)

小智 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>
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 10

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

你可以随时做:

 label1.Content = new TextBlock() { Text = textBox1.Text, TextWrapping = TextWrapping.Wrap };
Run Code Online (Sandbox Code Playgroud)

但是,如果所有这个"标签"用于显示文本,请使用TextBlock替代.


Kyl*_*Ren 5

我们需要放置某种可以包裹文本的控件,例如 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>
Run Code Online (Sandbox Code Playgroud)