
WPF中调用txt文档并让其在RichTextBox中表明
出于项目的才能,毕竟想直接将内容写在RichTextBox中,所以考虑到灵活性richtextbox读取,我想,还是是谁,总会想把内容写在一个文件里,然后去调用它以实现这个作用。我应该怎么想的,不过这个难题这么想都不算是个难点,源码量也不大,出于对WPF的不够了解,这个难题原来还真的难倒我了。
习惯winform的朋友,见到这个题,是不是也会和我一样挥笔疾书写下如下一段代码呢:
privatevoidbutton1_Click(objectsender, EventArgs e)
{
OpenFileDialog openFileDialog1 =newOpenFileDialog();
openFileDialog1.Filter ="文本文件(*.txt)|*.txt|(*.rtf)|*.rtf";
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamReader sr =newStreamReader(openFileDialog1.FileName, Encoding.Default);
richTextBox1.Text = sr.ReadToEnd();
sr.Close();
}
}
这段源码看上去其实并没有什么意见,因为,它放错了地方,是的richtextbox读取,它放置了WPF的代码页里面,很会说,这又怎么,还是是WPF,还是winform,甚至asp.net或者别的什么地方,源码是不会有多少区别的吧。是的,我也依然是怎么可能的,因为,编译器报错了,除了OpenFileDialog需要引用一个叫Microsoft.Win32的命名空间以外,还出了这些问题:

这个错误让我好像不可思议,盯着熟悉的DialogResult.OK的OK和richTextBox1.Text的Text下面的粉色波浪线,我这么都想不到还缺乏多少程序集引用。这才发现,WPF中的RichTextBox居然没有Text属性。好吧,我派兵了,这个难题我其实不会解决,上网去搜了好些代码,涵盖有怎么一段代码:
privatevoid打开文本文件ToolStripMenuItem_Click(objectsender, EventArgs e)

{
stringFilename;
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 = newFlowDocument(newParagraph(newRun("Simple FlowDocument")));
// Create an empty, default RichTextBox.
RichTextBox rtb = newRichTextBox();
// 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的标题,都是文档,也是区别不大才对,找了不到一小会,就找出破浪的博客园里的一篇标题,和我想要的答案看似不同却很类似:
publicstaticvoidLoadFromRTF(thisRichTextBox richTextBox, stringrtf)
{
if(string.IsNullOrEmpty(rtf))
{
thrownewArgumentNullException();
}
TextRange textRange = newTextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
using(MemoryStream ms = newMemoryStream())
{
using(StreamWriter sw = newStreamWriter(ms))
{
sw.Write(rtf);
sw.Flush();
ms.Seek(, SeekOrigin.Begin);
textRange.Load(ms, DataFormats.Rtf);
}
}
}
在这段源码中,我见过了一个对我来说陌生的朋友,TextRange,见到这段源码,我突然像是找出了救星,没错,我要的就是它,并且加载的是rtf,反而闭着耳朵也也是可以改成txt了,这个不费什么气力:
publicvoidLoadText()
{
stringtextFile =@"\Win\WPFDemo\WPFDemo\Resource\1.txt";
FileStream fs;
if(File.Exists(textFile))
{
fs =newFileStream(textFile, FileMode.Open, FileAccess.Read);
using(fs)
{
TextRange text =newTextRange(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的区别还是比较大的,不能一味用已有的常识解决新的难题呐~
原文地址:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-119347-1.html
最基本的汽车都造不出来
我们也派军舰到他家去吧
烊烊加油