WPF中读取txt文件并让其在RichTextBox中显示
出于项目的需要,本来想直接将内容写在RichTextBox中,不过考虑到灵活性,我想,不管是谁,都会想把内容写在一个文件里,然后去读取它以实现这个效果。我也是这么想的,而且这个问题怎么想都不算是个难题,代码量也不大,出于对WPF的不够了解,这个问题居然还真的难倒我了。
习惯winform的朋友,看到这个题,是不是也会和我一样挥笔疾书写下如下一段代码呢:
private void button1_Click(object sender, EventArgs e){OpenFileDialog openFileDialog1 = new OpenFileDialog();openFileDialog1.Filter = "文本文件(*.txt)|*.txt|(*.rtf)|*.rtf";if (openFileDialog1.ShowDialog() == DialogResult.OK){StreamReader sr = new StreamReader(openFileDialog1.FileName, Encoding.Default);richTextBox1.Text = sr.ReadToEnd();sr.Close();}}
这段代码看上去其实并没有什么异议,可是,它放错了地方,是的,它放在了WPF的代码页里面,很多人会说,这又如何,不管是WPF,还是winform,甚至asp.net或者别的什么地方,代码是不会有什么差别的吧。是的,我也一直是这么认为的,可是,编译器报错了,除了OpenFileDialog需要引用一个叫Microsoft.Win32的命名空间以外,还出了其他问题:
这个错误让我觉得不可思议,看着熟悉的DialogResult.OK的OK和richTextBox1.Text的Text下面的红色波浪线,我怎么都想不到还缺少什么程序集引用。这才发现,WPF中的RichTextBox居然没有Text属性。好吧,我投降了,这个问题我确实不会解决,上网去搜了好些代码,包括有这么一段代码:
private void 打开文本文件ToolStripMenuItem_Click(object sender, EventArgs e) { string Filename; pictureBox1.Visible = false; if (this.openFileDialog1.ShowDialog() == DialogResult.OK) { Filename = openFileDialog1.FileName; if (Filename != "") { this.textBox1.Text = Filename; this.richTextBox1.LoadFile(@Filename, RichTextBoxStreamType.PlainText); } } }
在写Demo的时候,一样出错了,this.richTextBox1.LoadFile的LoadFile下面多了红色的波浪线,还是提示缺少程序集引用。
正是因为只顾着搜寻代码,一心只想得到代码的最终答案,忽视了相对来说重要的问题。既然RichTextBox没有Text的属性,那么也就是说,它必然会有其他的属性来替代Text属性的工作,一个个属性看过去,居然发现有一个属性叫Document,Document是文档的意思,那么我们要读取的也是文档,会不会就是它呢?去MSDN里面看了看,里面有一段话这么说的:
属性值
类型:System.Windows.Documents.FlowDocument
一个 FlowDocument 对象,表示 RichTextBox 的内容。
默认情况下,此属性设置为空 FlowDocument。 具体地说,此空 FlowDocument 包含一个 Paragraph,而后者包含一个不包括任何文本的 Run。
很显然,我们要的就是RichTextBox的内容,当然,要读取的话,需要的是FlowDocument,流文档?参考MSDN中的做法:
// Create a simple FlowDocument to serve as content.
FlowDocument flowDoc = new FlowDocument(new Paragraph(new Run("Simple FlowDocument")));
// Create an empty, default RichTextBox.
RichTextBox rtb = new RichTextBox();
// This call sets the contents of the RichTextBox to the specified FlowDocument.
rtb.Document = flowDoc;
// This call gets a FlowDocument representing the contents of the RichTextBox.
FlowDocument rtbContents = rtb.Document;
这样的话好像不是读取电脑上已存在的txt文件,那么该怎么改变呢?我继续在网络中遨游。
网络果然是很强大的,虽然网络上几乎没有直接读取txt文档的文章,不过倒是有不少读取rtf的文章,都是文档,应该差别不大才对,找了不到一小会,就找到破浪的博客园里的一篇文章,和我想要的答案看似不同却很类似:http://www.cnblogs.com/whitewolf/archive/2011/01/09/1931290.html
public static void LoadFromRTF(this RichTextBox richTextBox, string rtf){if (string.IsNullOrEmpty(rtf)){throw new ArgumentNullException();}TextRange textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);using (MemoryStream ms = new MemoryStream()){using (StreamWriter sw = new StreamWriter(ms)){sw.Write(rtf);sw.Flush();ms.Seek(0, SeekOrigin.Begin);textRange.Load(ms, DataFormats.Rtf);}}}
在这段代码中,我见到了一个对我来说陌生的朋友,TextRange,看到这段代码,我突然像是找到了救星,没错,我要的就是它,虽然加载的是rtf,但是闭着眼睛也应该可以改成txt了,这个不费多少力气:
public void LoadText(){string textFile = @"\Win\WPFDemo\WPFDemo\Resource\1.txt";FileStream fs;if (File.Exists(textFile)){fs = new FileStream(textFile, FileMode.Open, FileAccess.Read);using (fs){TextRange text = new TextRange(richTextBox1.Document.ContentStart, richTextBox1.Document.ContentEnd);text.Load(fs, DataFormats.Text);}}}
写出代码虽开心,但运行成功才是王道,很兴奋的等待运行结果,居然是乱码:
乱码就乱码,没什么了不起的,停止运行后,在程序中添加一句话:StreamReader streamReader = new StreamReader(fs, System.Text.Encoding.UTF8);看你还乱码不?哼哼~
结果居然让我失望,果然还是乱码,这究竟是怎么回事啊?思量了好久,没找到原因,网络上的方法也几乎没效果,找啊找,就在自己觉得绝望的时候,突然一个念头闪过:也许不是代码问题,可是,不是代码问题,莫非是文本文档的格式问题?打开文本文档,选择另存为,果然,问题一目了然了:
原来默认编码是ANSI,将它改成UTF-8之后保存文件,那行代码加不加结果都能如期运行了:
吼吼,虽然这个问题很简单,不过还是有收获的,这才发现,WPF和winform的差别还是比较大的,不能一味用已有的知识解决新的问题呐~
转载于:https://www.cnblogs.com/Jennifer/archive/2011/06/11/2078470.html
WPF中读取txt文件并让其在RichTextBox中显示相关推荐
- matlab中读文件的行数_Matlab中读取txt文件的几种方法
Matlab中读取txt文件的几种方法 一.纯数据文件(没有字母和中文,纯数字) 对于这种txt文档,从matalb中读取就简单多了 例如test.txt文件,内容为"17.901 -1.1 ...
- matlab中如何读写txt,Matlab中读取txt文件的几种方法
Matlab中读取txt文件的几种方法 matlab读取文本文件的几种函数: 1.load--适合读取纯数据文本: 2.importdata--只读取数据,自动省略数据格式前后的字符,超大文件不适合: ...
- Android从assets和raw中读取txt文件
方法一.将要读取的txt文件拷贝到Android工程目录下的assets文件夹下 方法二.在res文件夹下新建raw文件夹,将txt拷贝到该目录下 本方法是从assets中读取 /*** 从asset ...
- Python中读取txt文件的三种可行办法
DataTest.txt中的文件内容,文件最后尽量不要留空行,否则有的时候会出现error 1,2,3 4,5,6 7,8,9 第一种方式:使用 csv.reader()读取txt文件 import ...
- IDL读取TXT文件并写入二维数组中【转】
pro try COMPILE_OPT IDL2 ;首先读取txt文件 file=dialog_pickfile() files1=file_search('*',count=k) openr,lun ...
- matlab怎么读txt文件字符串,Matlab中读取txt文件的几种方法
一.纯数据文件(没有字母和中文,纯数字) a=importdata('*.txt');%%%*为所存的文件名 a1=a.data;%%%文件中的数字 a2=a.textdata;%%%文件中的非数字 ...
- Matlab中读取txt文件的几种方法
matlab读取文本文件的几种函数: 1.load--适合读取纯数据文本: 2.importdata--只读取数据,自动省略数据格式前后的字符,超大文件不适合: 3.textread.textscan ...
- c++语言读txt数据,关于C++中读取txt文件中字符串 - 程序语言 - 小木虫 - 学术 科研 互动社区...
#include<iostream> #include<fstream> #include<string> #include<vector> using ...
- python中读取txt文件、统计其中所有字母出现的频度_Python编程小技巧:如何统计序列中元素的出现频度...
原标题:Python编程小技巧:如何统计序列中元素的出现频度 实际案例 某随机序列中,找到出现次数最高的三个元素,他们的出现次数是多少? 对某英文文章的单词进行词频统计,找到出现次数最高的10个单词, ...
最新文章
- 意大利物联网技术发展现状
- Myeclipse的破解步骤
- 项目进度管理:控制进度
- ajax简单的验证,ajax初探--实现简单实时验证(示例代码)
- C语言字符串压缩显示
- java哪个城市的需求量大_4大互联网热门城市Java薪资情况,看完你想去哪个城市发展呢?...
- maven自定义脚手架(快速生成项目)
- 源码 状态机_LLVM学习笔记(1)--初探源码
- ResNet论文笔记
- yaml文件解析:nodejs篇
- matlab图片渲染,图像 – 在内存中渲染MATLAB图
- With语句是什么?
- Bootstrap Paginator 分页插件参数介绍及使用
- ubuntu18.04 安装 腾讯qq
- JSON.stringify 语法讲解
- html5网页制作的基本步骤,网页制作流程介绍
- LOJ6437 PKUSC2018 PKUSC
- 电脑桌面云便签怎么新建分类文件夹标签?
- docker,deamon.json文件说明
- matlab 变速不变调,使用GoldWave 轻松实现变速不变调