提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2011-06-13 15:19:22.000|阅读 2331 次
概述:出于项目的需要,本来想直接将内容写在RichTextBox中,不过考虑到灵活性,我想,不管是谁,都会想把内容写在一个文件里,然后去读取它以实现这个效果。我也是这么想的,而且这个问题怎么想都不算是个难题,代码量也不大,出于对WPF的不够了解,这个问题居然还真的难倒我了。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
出于项目的需要,本来想直接将内容写在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的文章,都是文档,应该差别不大才对,找了不到一小会,就找到破浪的博客园里的一篇文章,和我想要的答案看似不同却很类似://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\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);
}
}
}
写出代码虽开心,但运行成功才是王道,很兴奋的等待运行结果,居然是乱码:
乱码就乱码,没什么了不起的,停止运行后,在程序中添加一句话:StreamReader streamReader = new StreamReader(fs, System.Text.Encoding.UTF8);看你还乱码不?哼哼~
结果居然让我失望,果然还是乱码,这究竟是怎么回事啊?思量了好久,没找到原因,网络上的方法也几乎没效果,找啊找,就在自己觉得绝望的时候,突然一个念头闪过:也许不是代码问题,可是,不是代码问题,莫非是文本文档的格式问题?打开文本文档,选择另存为,果然,问题一目了然了:
原来默认编码是ANSI,将它改成UTF-8之后保存文件,那行代码加不加结果都能如期运行了:
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
文章转载自:博客园面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢