WPF中读取txt文件并让其在RichTextBox中显示

WPF中读取txt文件并让其在RichTextBox中显示

      出于项目的需要,本来想直接将内容写在RichTextBox中,不过考虑到灵活性,我想,不管是谁,都会想把内容写在一个文件里,然后去读取它以实现这个效果。我也是这么想的,而且这个问题怎么想都不算是个难题,代码量也不大,出于对WPF的不够了解,这个问题居然还真的难倒我了。
     习惯winform的朋友,看到这个题,是不是也会和我一样挥笔疾书写下如下一段代码呢:

1

2

3

4

5

6

7

8

9

10

11

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属性。好吧,我投降了,这个问题我确实不会解决,上网去搜了好些代码,包括有这么一段代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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了,这个不费多少力气:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用[1],可以使用以下步骤在WPF读取折线的TXT文件并绘制曲线: 1. 在XAML文件添加一个按钮、一个文本框和一个Chart控件。 ```XAML <Button Content="打开" Click="OpenFile_Click"/> <TextBox x:Name="FilePathTextBox"/> <chartingToolkit:Chart> <chartingToolkit:LineSeries Title="折线图" DependentValuePath="Value" IndependentValuePath="Key"/> </chartingToolkit:Chart> ``` 2. 在.cs文件添加以下代码: ```C# private void OpenFile_Click(object sender, RoutedEventArgs e) { Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); dlg.DefaultExt = ".txt"; dlg.Filter = "Text documents (.txt)|*.txt"; Nullable<bool> result = dlg.ShowDialog(); if (result == true) { string filename = dlg.FileName; FilePathTextBox.Text = filename; // 读取文件内容 string[] lines = System.IO.File.ReadAllLines(filename); // 将文件内容转换为数据点 List<KeyValuePair<int, int>> valueList = new List<KeyValuePair<int, int>>(); for (int i = 0; i < lines.Length; i++) { string[] values = lines[i].Split(','); int x = int.Parse(values[0]); int y = int.Parse(values[1]); KeyValuePair<int, int> pair = new KeyValuePair<int, int>(x, y); valueList.Add(pair); } // 将数据点添加到折线图 LineSeries lineSeries = (LineSeries)Chart.Series[0]; lineSeries.ItemsSource = valueList; } } ``` 3. 在.cs文件添加以下命名空间: ```C# using System.Collections.Generic; using System.Windows.Controls.DataVisualization.Charting; ``` 4. 运行程序并单击“打开”按钮,选择要读取TXT文件,然后单击“确定”按钮。程序将读取文件内容并将其转换为数据点,然后将数据点添加到折线图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值