我有一个TextBox
和一个Label。点击一个按钮后,我执行以下代码:
label1.Content = textbox1.Text;
我的问题是,如何启用标签的文本换行?可能会有过多的文本无法在一行上显示,如果是这种情况,我希望它能自动换行到多行。
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>
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
的功能,同时还能够包装文本。
我使用了以下代码。
<Label>
<Label.Content>
<AccessText TextWrapping="Wrap" Text="xxxxx"/>
</Label.Content>
</Label>
<Label>
<TextBlock Text="Long Text . . . ." TextWrapping="Wrap" />
</Label>
要在标签控件中包装文本,请按以下方式更改标签的模板:
<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类而不是Label类。这样可以适当设置TextWrapping。
你总是可以这样做:
label1.Content = new TextBlock() { Text = textBox1.Text, TextWrapping = TextWrapping.Wrap };
然而,如果所有这些"标签"仅用于显示文本,则应使用TextBlock
。
Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
- dashrader <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>
<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>
我使用这个方法从MySql数据库中检索数据:
AccessText a = new AccessText();
a.Text=reader[1].ToString(); // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;
尝试使用这个
lblresult.Content = lblresult.Content + "prime are :" + j + "\n";
TextBlock
和TextBox
混淆了?自从WPF代号为"Avalon"以来,TextBlock
一直都是只读的。 - BrainSlugs83Padding="5"
以匹配表单上其他Label
控件的填充。请参见下面的Rajesh的答案。 - Bob Kaufman