出于项目的需要,本来想直接将内容写在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中显示相关推荐

  1. matlab中读文件的行数_Matlab中读取txt文件的几种方法

    Matlab中读取txt文件的几种方法 一.纯数据文件(没有字母和中文,纯数字) 对于这种txt文档,从matalb中读取就简单多了 例如test.txt文件,内容为"17.901 -1.1 ...

  2. matlab中如何读写txt,Matlab中读取txt文件的几种方法

    Matlab中读取txt文件的几种方法 matlab读取文本文件的几种函数: 1.load--适合读取纯数据文本: 2.importdata--只读取数据,自动省略数据格式前后的字符,超大文件不适合: ...

  3. Android从assets和raw中读取txt文件

    方法一.将要读取的txt文件拷贝到Android工程目录下的assets文件夹下 方法二.在res文件夹下新建raw文件夹,将txt拷贝到该目录下 本方法是从assets中读取 /*** 从asset ...

  4. Python中读取txt文件的三种可行办法

    DataTest.txt中的文件内容,文件最后尽量不要留空行,否则有的时候会出现error 1,2,3 4,5,6 7,8,9 第一种方式:使用 csv.reader()读取txt文件 import ...

  5. IDL读取TXT文件并写入二维数组中【转】

    pro try COMPILE_OPT IDL2 ;首先读取txt文件 file=dialog_pickfile() files1=file_search('*',count=k) openr,lun ...

  6. matlab怎么读txt文件字符串,Matlab中读取txt文件的几种方法

    一.纯数据文件(没有字母和中文,纯数字) a=importdata('*.txt');%%%*为所存的文件名 a1=a.data;%%%文件中的数字 a2=a.textdata;%%%文件中的非数字 ...

  7. Matlab中读取txt文件的几种方法

    matlab读取文本文件的几种函数: 1.load--适合读取纯数据文本: 2.importdata--只读取数据,自动省略数据格式前后的字符,超大文件不适合: 3.textread.textscan ...

  8. c++语言读txt数据,关于C++中读取txt文件中字符串 - 程序语言 - 小木虫 - 学术 科研 互动社区...

    #include<iostream> #include<fstream> #include<string> #include<vector> using ...

  9. python中读取txt文件、统计其中所有字母出现的频度_Python编程小技巧:如何统计序列中元素的出现频度...

    原标题:Python编程小技巧:如何统计序列中元素的出现频度 实际案例 某随机序列中,找到出现次数最高的三个元素,他们的出现次数是多少? 对某英文文章的单词进行词频统计,找到出现次数最高的10个单词, ...

最新文章

  1. 意大利物联网技术发展现状
  2. Myeclipse的破解步骤
  3. 项目进度管理:控制进度
  4. ajax简单的验证,ajax初探--实现简单实时验证(示例代码)
  5. C语言字符串压缩显示
  6. java哪个城市的需求量大_4大互联网热门城市Java薪资情况,看完你想去哪个城市发展呢?...
  7. maven自定义脚手架(快速生成项目)
  8. 源码 状态机_LLVM学习笔记(1)--初探源码
  9. ResNet论文笔记
  10. yaml文件解析:nodejs篇
  11. matlab图片渲染,图像 – 在内存中渲染MATLAB图
  12. With语句是什么?
  13. Bootstrap Paginator 分页插件参数介绍及使用
  14. ubuntu18.04 安装 腾讯qq
  15. JSON.stringify 语法讲解
  16. html5网页制作的基本步骤,网页制作流程介绍
  17. LOJ6437 PKUSC2018 PKUSC
  18. 电脑桌面云便签怎么新建分类文件夹标签?
  19. docker,deamon.json文件说明
  20. matlab 变速不变调,使用GoldWave 轻松实现变速不变调

热门文章

  1. 常用的meta标签总结
  2. iOS7 UIKit Dynamics 的初步研究
  3. 用泛型来实现编译时期的类型推断
  4. 网页布局(固定与不固定原理)
  5. SCSI 总线和协议
  6. 张一鸣演讲全文:外部波澜起伏,内心平静如常
  7. 被丧心病狂的验证码虐过,来感受一下交互体验很好的十款吧
  8. 绿色经营:从优秀到卓越最显性准则
  9. find_in_set()和in()比较
  10. EF Core Model更新迁移