Label控件继承于ContentControl控件,它是一个文本标签,如果您想修改它的标签内容,请设置Content属性。我们曾提过ContentControl的Content属性是object类型,意味着Label的Content也是可以设置为任意的引用类型的。
前端代码
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<Label Content="这是一个Label标签"/>
<Label>
<Label.Content>
<Button Content="确定" Click="_Button1_Click"/>
Label.Content>
Label>
StackPanel>
后端代码
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
private void _Button1_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
}
我们给第二个标签的Content属性设置了一个按钮,并对按钮的Click事件做了订阅回调。此时的Button是可以正常使用 。只不过,通常情况下,我们的Label只是用来显示一段文字,很少在Contnet里面编写其它控件代码。如果要编写其它控件代码以实现更复杂的自定义控件效果,建议使用UserControl用户控件。
对于文本的显示,除了可以在Label中显示,还有一个控件也可以实现,那就是TextBlock文字块。而且,TextBlock控件直接从FrameworkElement基类继承而来,效率比Label标签更高。
TextBlock是专业处理文本显示的控件,在功能上比Label更全面。
TextBlock提供了非常丰富的文本相关的属性。
<WrapPanel>
<TextBlock Text="这是一个TextBlock文字块" Margin="5"/>
<TextBlock Text="粗体文字" FontWeight="Bold" Margin="5"/>
<TextBlock Text="粗体文字" FontWeight="Light" Margin="5"/>
<TextBlock Text="斜体文字" FontStyle="Italic" Margin="5"/>
<TextBlock Text="微软雅黑" FontFamily="Microsoft YaHei UI" Margin="5"/>
<TextBlock Text="大号字体" FontSize="30" Margin="5"/>
<TextBlock Text="红色文字" Foreground="Red" Margin="5"/>
<TextBlock Text="底色文字" Foreground="Yellow" Background="Red" Margin="5"/>
<TextBlock Text="内间距文字" Foreground="Yellow" Background="Red" Padding="10" Margin="5"/>
<TextBlock Background="LightGray" Height="25">
<Run Foreground="Red">这行文字</Run>
<Run Foreground="Green">由三部分</Run>
<Run Foreground="Blue">组成</Run>
</TextBlock>
<Grid Width="150" Height="100" Margin="5" Background="LightGoldenrodYellow">
<TextBlock Text="这段文字体现了文字的文本换行属性TextWrapping" TextWrapping="Wrap" Margin="10"/>
</Grid>
<!--使用Run-->
<Grid>
<TextBlock x:Name="textblock"
Width="320"
Height="100"
FontSize="15"
FontFamily="微软雅黑"
FontWeight="Black"
FontStretch="Condensed"
Foreground="#dddddd"
Background="Teal"
TextAlignment="Center"
TextWrapping="Wrap"
TextTrimming="CharacterEllipsis"
Margin="10" Padding="5"
HorizontalAlignment="Left"
VerticalAlignment="Center"
LineHeight="30"
ToolTip="《临江仙·滚滚长江东逝水》">
<Run Foreground="#CDB632" TextDecorations="Underline">
滚滚长江东逝水,浪花淘尽英雄。是非成败转头空。青山依旧在,几度夕阳红。
</Run>
<Run Text="白发渔樵江渚上,惯看秋月春风。一壶浊酒喜相逢。古今多少事,都付笑谈中。 ">
</Run>
</TextBlock>
</Grid>
</WrapPanel>
TextBlock大多数的属性应用都比较简单,容易理解。
Inlines属性是一个比较强大的属性,深入理解后,可以实现意想不到的效果。
TextEffects也是一个非常强大的属性,这需要掌握WPF的动画、触发器、关键帧等知识,才能实现文本的动画特效。我们将在学完动画后,再回头探讨这些内容。
几乎所有的文本、数字、符号的输入都是用TextBox文本框来完成的。TextBox用来获取用户的键盘输入的信息,这也是一个常用的控件。
它继承于TextBoxBase,而TextBoxBase又继承于Control。
TextBoxBase基类提供了两个事件,分别是TextChanged和SelectionChanged。
TextChanged事件:只要文本框中的内容被修改,将会触发引事件,这通常用来做一些判断业务。比如某个文本框只能输入数字,那就可以去订阅TextChanged事件。
SelectionChanged事件:选中的文本框内容发生改变时引发的事件。
TextBox文本框本身没有任务事件,都是继承父类的事件。
前端代码
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="用户名" Margin="5"/>
<TextBox x:Name="_textbox" Width="100" Height="25" MaxLength="10" CharacterCasing="Upper"/>
<Button x:Name="_button" Content="确定" Height="25" Margin="5 0" Click="_button_Click"/>
StackPanel>
后端代码
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
private void _button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show($"您的用户名:{_textbox.Text}");
}
}
我们使用了CharacterCasing="Upper"这个设置,可以看到图片中的显示效果,虽然我在输入时是小写的china字符,但是,TextBox会转换成大写的CHINA,另外,总长度不能超过10个字符。
最后要获取TextBox文本框的内容,使用Text属性即可。当我们在学习了样式之后,我们还会回过头来,对TextBox控件进行深入学习。另外,TextBox还有一个控件,也是继承于TextBoxBase基类,它叫RichTextBox 类。这个控件的功能更加强大,能够对FlowDocument流文档进行操作。如果想开发类似Word的桌面软件,RichTextBox 和FlowDocument搭配组合是非常好的选择。
RichTextBox继承于TextBoxBase基类,所以很大程度上与TextBox控件类似,两者在某些情况下可以互相替换。但是,如果要为用户提供更强大的文档编辑功能,非RichTextBox莫属。
RichTextBox控件有一个带参数的构造函数,参数的类型是FlowDocument类,另外,它还有一个Document属性,类型也是FlowDocument类,说明RichTextBox控件的元素必须且只能是FlowDocument类,如果试图将RichTextBox.Document=null,会发现它会报错。
前端代码
<StackPanel>
<RichTextBox x:Name="_richTextBox" Margin="10 5" Height="270">
<FlowDocument>
<Paragraph>RichTextBox富文本框控件到底有什么强大的功能?
<Bold Foreground="DarkRed">请看下面.Bold>
Paragraph>
<Paragraph Foreground="Blue">RichTextBox唯一的子元素是FlowDocumentParagraph>
<Paragraph Foreground="DarkGreen">
FlowDocument是指流文档,一个流文档由一个或多个Block构成,
所以它有一个Blocks属性。Block只是一个抽象基类,
所以流文档的子元素其实是继承了Block的子类,例如:
Paragraph>
<List MarkerOffset="25" MarkerStyle="Decimal" StartIndex="1">
<ListItem>
<Paragraph>BlockUIContainer(UI元素容器)Paragraph>
ListItem>
<ListItem>
<Paragraph>List(有序列表)Paragraph>
ListItem>
<ListItem>
<Paragraph>Paragraph(段落)Paragraph>
ListItem>
<ListItem>
<Paragraph>Section(分组)Paragraph>
ListItem>
<ListItem>
<Paragraph>Table(网格)Paragraph>
ListItem>
List>
FlowDocument>
RichTextBox>
<Button x:Name="_button" Content="确定" Margin="10,5" Click="_button_Click"/>
StackPanel>
后端代码
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
private void _button_Click(object sender, RoutedEventArgs e)
{
TextRange textRange = new TextRange(_richTextBox.Document.ContentStart, _richTextBox.Document.ContentEnd);
MessageBox.Show(textRange.Text);
Paragraph paragraph = new Paragraph();
Run run = new Run($"当前时间:{DateTime.Now}"); //手动加换行
run.Foreground = Brushes.Black;
paragraph.Inlines.Add(run);
_richTextBox.Document.Blocks.Add(paragraph);
}
}
如上所示,我们在窗体中实例化了一个RichTextBox控件,并实例化了一个FlowDocument对象。RichTextBox唯一的子元素是FlowDocument。
FlowDocument是指流文档,一个流文档由一个或多个Block构成,所以它有一个Blocks属性。Block只是一个抽象基类,FlowDocument流文档的子元素都继承了Block抽象基类,例如:
BlockUIContainer是一个非常强大的段落元素,因为它可以直接包含WPF的控件。这样一来,我们就可以将设计的UI写入到流文档中显示或打印。
上面这五个元素继承了TextElement、FrameworkContentElement和ContentElement三个父素,所以实际上这五个子元素就拥有了许多字体属性的设置、资源、样式、数据绑定、以及各种事件的应用。
如果要获取RichTextBox的文本信息,可以使用TextRange类。FlowDocument类有两个属性,分别ContentStart和ContentEnd,表示文字内容的开始和结束。
所以通过TextRange类的Text,我们就能访问到RichTextBox控件的内容。