轉(zhuǎn)帖|其它|編輯:郝浩|2011-06-13 15:19:22.000|閱讀 2358 次
概述:出于項(xiàng)目的需要,本來(lái)想直接將內(nèi)容寫(xiě)在RichTextBox中,不過(guò)考慮到靈活性,我想,不管是誰(shuí),都會(huì)想把內(nèi)容寫(xiě)在一個(gè)文件里,然后去讀取它以實(shí)現(xiàn)這個(gè)效果。我也是這么想的,而且這個(gè)問(wèn)題怎么想都不算是個(gè)難題,代碼量也不大,出于對(duì)WPF的不夠了解,這個(gè)問(wèn)題居然還真的難倒我了。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
出于項(xiàng)目的需要,本來(lái)想直接將內(nèi)容寫(xiě)在RichTextBox中,不過(guò)考慮到靈活性,我想,不管是誰(shuí),都會(huì)想把內(nèi)容寫(xiě)在一個(gè)文件里,然后去讀取它以實(shí)現(xiàn)這個(gè)效果。我也是這么想的,而且這個(gè)問(wèn)題怎么想都不算是個(gè)難題,代碼量也不大,出于對(duì)WPF的不夠了解,這個(gè)問(wèn)題居然還真的難倒我了。
習(xí)慣winform的朋友,看到這個(gè)題,是不是也會(huì)和我一樣揮筆疾書(shū)寫(xiě)下如下一段代碼呢:
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();
}
}
這段代碼看上去其實(shí)并沒(méi)有什么異議,可是,它放錯(cuò)了地方,是的,它放在了WPF的代碼頁(yè)里面,很多人會(huì)說(shuō),這又如何,不管是WPF,還是winform,甚至asp.net或者別的什么地方,代碼是不會(huì)有什么差別的吧。是的,我也一直是這么認(rèn)為的,可是,編譯器報(bào)錯(cuò)了,除了OpenFileDialog需要引用一個(gè)叫Microsoft.Win32的命名空間以外,還出了其他問(wèn)題:
這個(gè)錯(cuò)誤讓我覺(jué)得不可思議,看著熟悉的DialogResult.OK的OK和richTextBox1.Text的Text下面的紅色波浪線(xiàn),我怎么都想不到還缺少什么程序集引用。這才發(fā)現(xiàn),WPF中的RichTextBox居然沒(méi)有Text屬性。好吧,我投降了,這個(gè)問(wèn)題我確實(shí)不會(huì)解決,上網(wǎng)去搜了好些代碼,包括有這么一段代碼:
private void 打開(kāi)文本文件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);
}
}
}
在寫(xiě)Demo的時(shí)候,一樣出錯(cuò)了,this.richTextBox1.LoadFile的LoadFile下面多了紅色的波浪線(xiàn),還是提示缺少程序集引用。
正是因?yàn)橹活欀褜ごa,一心只想得到代碼的最終答案,忽視了相對(duì)來(lái)說(shuō)重要的問(wèn)題。既然RichTextBox沒(méi)有Text的屬性,那么也就是說(shuō),它必然會(huì)有其他的屬性來(lái)替代Text屬性的工作,一個(gè)個(gè)屬性看過(guò)去,居然發(fā)現(xiàn)有一個(gè)屬性叫Document,Document是文檔的意思,那么我們要讀取的也是文檔,會(huì)不會(huì)就是它呢?去MSDN里面看了看,里面有一段話(huà)這么說(shuō)的:
屬性值
類(lèi)型:System.Windows.Documents.FlowDocument
一個(gè) FlowDocument 對(duì)象,表示 RichTextBox 的內(nèi)容。
默認(rèn)情況下,此屬性設(shè)置為空 FlowDocument。 具體地說(shuō),此空 FlowDocument 包含一個(gè) Paragraph,而后者包含一個(gè)不包括任何文本的 Run。
很顯然,我們要的就是RichTextBox的內(nèi)容,當(dāng)然,要讀取的話(huà),需要的是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;
這樣的話(huà)好像不是讀取電腦上已存在的txt文件,那么該怎么改變呢?我繼續(xù)在網(wǎng)絡(luò)中遨游。
網(wǎng)絡(luò)果然是很強(qiáng)大的,雖然網(wǎng)絡(luò)上幾乎沒(méi)有直接讀取txt文檔的文章,不過(guò)倒是有不少讀取rtf的文章,都是文檔,應(yīng)該差別不大才對(duì),找了不到一小會(huì),就找到破浪的博客園里的一篇文章,和我想要的答案看似不同卻很類(lèi)似://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);
}
}
}
在這段代碼中,我見(jiàn)到了一個(gè)對(duì)我來(lái)說(shuō)陌生的朋友,TextRange,看到這段代碼,我突然像是找到了救星,沒(méi)錯(cuò),我要的就是它,雖然加載的是rtf,但是閉著眼睛也應(yīng)該可以改成txt了,這個(gè)不費(fèi)多少力氣:
public void LoadText()
{
string textFile = @ "\Win\WPFDemo\WPFDemo\Resource\test.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);
}
}
}
寫(xiě)出代碼雖開(kāi)心,但運(yùn)行成功才是王道,很興奮的等待運(yùn)行結(jié)果,居然是亂碼:
亂碼就亂碼,沒(méi)什么了不起的,停止運(yùn)行后,在程序中添加一句話(huà):StreamReader streamReader = new StreamReader(fs, System.Text.Encoding.UTF8);看你還亂碼不?哼哼~
結(jié)果居然讓我失望,果然還是亂碼,這究竟是怎么回事啊?思量了好久,沒(méi)找到原因,網(wǎng)絡(luò)上的方法也幾乎沒(méi)效果,找啊找,就在自己覺(jué)得絕望的時(shí)候,突然一個(gè)念頭閃過(guò):也許不是代碼問(wèn)題,可是,不是代碼問(wèn)題,莫非是文本文檔的格式問(wèn)題?打開(kāi)文本文檔,選擇另存為,果然,問(wèn)題一目了然了:
原來(lái)默認(rèn)編碼是ANSI,將它改成UTF-8之后保存文件,那行代碼加不加結(jié)果都能如期運(yùn)行了:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園