ChatGPT解决这个技术问题 Extra ChatGPT

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

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

 label1.Content = textbox1.Text; 

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


C
Cody Gray

Label 控件不直接支持 WPF 中的文本换行。您应该改用 TextBlock。 (当然,如果您愿意,您可以将 TextBlock inside 放在 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>

这很好,但如果您想使用 Label 的 Target 属性功能,则不能——公平地说,这可能是您在 TextBlock 上使用 Label 的唯一原因。我已经提供了这个问题的答案,展示了如何包装在标签中(下)
JulianM - 他们已经只读了 stackoverflow.com/questions/5073244/making-textblock-readonly ?也许他们不在 2011 年
@JulianM 您是否将 TextBlockTextBox 混淆了? -- 自 WPF 代码命名为“Avalon”以来,TextBlock 一直是只读的。
我需要设置 Padding="5" 以匹配表单上其他 Label 控件中的填充。请参阅下面的 Rajesh 的回答。
K
Karlyr

通常,您不能用 TextBlock 替换 Label,因为您想使用 Target 属性(在使用键盘时将焦点设置到 targeted 控件,例如示例中的 ALT+C下面的代码),因为这就是 LabelTextBlock 上真正提供的所有功能。

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


这真的有效吗?从我所看到的 WPF 添加的文本块在逻辑树中不存在并且不会获取您的资源。
是的,这确实有效——我在发布答案之前对其进行了测试。你是对的,目标元素不在逻辑树中,但在这里重要的是视觉树。
这已经有几年了,但这似乎不适用于 VS 2015。似乎有效的是在标签 中使用 TextBlock
F
ForceMagic

我使用了以下代码。

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

这对我来说最有效。简单,无需使用其他控件或添加大量代码。
@jeremychan,我会将此标记为答案。我很高兴我向下滚动并看到了这个答案。
我恢复了我的赞成票。我尝试使用它,但它绕过了我的“HorizontalAlignment="Center"”。与使用 Textblock 不同,它没有...
Label.Content 部分是不必要的,因为标签标签中的任何内容都会自动成为内容。尽管如此,这是一个很好的答案,因为它保留了提供访问密钥的能力,而使用 TextBlock 的所有解决方案在这方面都失败了。
A
A Coder

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

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

我喜欢这种方法,因为它允许您的标签样式应用于此文本块,而无需为 TextBlock 制作其他样式。
s
sergiol

要在标签控件中换行,请将标签的模板更改如下:

<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/…
R
Reed Copsey

我建议不要使用标签类,而是使用 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 };
K
Kylo Ren

我们需要放置某种可以包装文本的控件,例如 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>

R
RathapongPumpo

尝试使用这个

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

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

D
DiogoA.

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

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