本文利用WPF的Rich TextBox控件制作简易的记事本,实现文本文档的打开与阅读。曾尝试利用SetParent()方法把windows自带的记事本嵌入到WPF中,但是按钮较小,不适合项目需要。因此才想着利用Rich TextBox控件自己做。
在XAML中放入一个Rich TextBox(用来显示文档)和5个Button(作用分别是打开文件、上一行、下一行、上一页和下一页)
<Grid> <Grid.RowDefinitions> <RowDefinition Height="108"/> <RowDefinition Height="108"/> <RowDefinition Height="108"/> <RowDefinition Height="107"/> <RowDefinition Height="107"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="126"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="957"/> </Grid.ColumnDefinitions> <Button x:Name="Openbt" Style="{StaticResource btStyle}" Grid.Row="0" Grid.Column="0" Width="124" Content="打开文件
OpenFile" Click="Openbt_Click"/> <Button x:Name="Lastlbt" Style="{StaticResource btStyle}" Grid.Row="1" Grid.Column="0" Width="124" Content=" 上一行
LastLine" Click="Lastl_Click"/> <Button x:Name="Nextlbt" Style="{StaticResource btStyle}" Grid.Row="2" Grid.Column="0" Width="124" Content=" 下一行
NextLine" Click="Nextl_Click"/> <Button x:Name="Lastpbt" Style="{StaticResource btStyle}" Grid.Row="3" Grid.Column="0" Width="124" Content=" 上一页
LastPage" Click="Lastp_Click" /> <Button x:Name="Nextpbt" Style="{StaticResource btStyle}" Grid.Row="4" Grid.Column="0" Width="124" Content=" 下一页
NextPage" Click="Nextp_Click"/> <RichTextBox x:Name="richtb" Grid.Row="0" Grid.RowSpan="5" Grid.Column="2" FontSize="18"/> </Grid>注意,上面使用了Grid.RowDefinitions把Grid分成了5行3列方便布局。Button使用了Style=”{StaticResource btStyle}”统一外观。其Style代码如下所示:
<Window.Resources> <Style x:Key="btStyle" TargetType="{x:Type Button}"> <Setter PRoperty="Background" Value="#FF0091FF"/> <Setter Property="Foreground" Value="#FFFFE100"/> <Setter Property="FontSize" Value="18"/> <Setter Property="FontWeight" Value="Bold"/> </Style> </Window.Resources>最后得到的界面外观图如下所示:
左侧为五个功能按钮,右侧为Rich TextBox显示区域。
浏览文件功能需要使用windows API Code Pack,VS2015中好像集成的有,添加引用就好了。我使用的VS2013,所以需要安装。VS打开工程,找到“工具”>>“库程序包管理器”>>”程序包管理器控制台”,输入:
安装完成之后,会自动添加引用到工程:
添加命名空间
using Microsoft.WindowsAPICodePack.Dialogs;下面写“打开文件”按钮的Click
private void Openbt_Click(object sender, RoutedEventArgs e) { CommonOpenFileDialog cofd2 = new CommonOpenFileDialog(); cofd2.Filters.Add(new CommonFileDialogFilter("文档文件", "*.txt")); string str = null; if (cofd2.ShowDialog() == CommonFileDialogResult.Ok) { FilePath = cofd2.FileName; FileStream myfile = new FileStream(FilePath, FileMode.Open, Fileaccess.Read); StreamReader reader = new StreamReader(myfile, System.Text.Encoding.Default); str = rder.ReadToEnd(); } richtb.Document.Blocks.Clear(); richtb.Document.Blocks.Add(new Paragraph(new Run(str))); //显示内容 }上面最后两句代码的richtb为界面中Rich TextBox的名字。这里需要注意,可能很多博客里面会使用Rich TextBox.LoadFile()直接加载文档,但是这个只是System.Windows.Forms中的Rich TextBox。在WPF中的Rich TextBox是没有这个方法的。而我们知道,System.Windows.Forms中的控件,在界面中会默认置顶的,所以会遮挡其它WPF控件,可能会产生其他后续问题。经过实际测试:
richtb.Document.Blocks.Add(new Paragraph(new Run(str)));这句代码打开文档的效率很高, 不会出现界面卡顿延迟的情况,点击“打开文件”运行效果图如下。
打开文档之后:
Rich TextBox有丰富的文本格式,所以上面显示的字体,背景等属性都是可以自己定义的,不再赘述。
其它四个按钮(上一行,下一行,上一页,下一页)的Click直接在里面使用Rich TextBox自带的方法就可以了。
private void Lastl_Click(object sender, RoutedEventArgs e) { richtb.LineUp(); } private void Nextl_Click(object sender, RoutedEventArgs e) { richtb.LineDown(); } private void Lastp_Click(object sender, RoutedEventArgs e) { richtb.PageUp(); } private void Nextp_Click(object sender, RoutedEventArgs e) { richtb.PageDown(); }代码自己敲出来的才是自己的。继续努力!
新闻热点
疑难解答