none
富文本编辑器的选择(烦请Bob指导) RRS feed

  • 问题

  • 我需要做一个富文本编辑器,类似word。不过为了和同事共享保存的文档。他要求使用html(带附件目录那种)格式保存文档。我想了一下,有2条路可以选:

    1、选择/开发一个html编辑器,好处是支持直接复制/粘贴网页,不过我对html不熟悉,也不知道有没有比较现成的WPF控件可以使用或参考

    2、用RichTextBox/FlowDocument编辑文本,保存/读取时再完成xaml 和html的互转(这个工作可以考虑让熟悉html的同事来做,不过我得告诉他FlowDocument里的各种标签的定义等等,他正好不了解xaml)。如果选择这种方法,不知道会不会有什么标签不能转换的问题。另外复制网页粘贴到RichTextBox好像不能天然支持,如果要自己写代码支持,需要学习和关注哪些知识?

    请Bob帮我参考一下,给点意见和学习资料的建议。

    万分感谢!

    2012年6月12日 3:03

答案

全部回复

  • 1. 这类控件很多都是基于HTML/JS的,所以在WPF中有一个方法就是通过Frame直接呈现一个HTML page, 然后Page中放置一个HTML富文本编辑器。 比如国内 百度的 UEditor http://ueditor.baidu.com/website/ 还有很多国外的:CKEditorWYMeditor 等, 你可以参考这个文章做设计: http://www.codeproject.com/Articles/15559/A-Windows-Forms-based-text-editor-with-HTML-output 或者 这篇是直接针对 WYMeditor 的 http://geekswithblogs.net/QuandaryPhase/archive/2009/03/13/wpf-wysiwyg-html-editor.aspx

    纯WPF的控件。一些商业公司中有提供,比如DevExpress的Rich Editor http://devexpress.com/Products/NET/Controls/WPF/Rich_Editor/

    还有一个较小的个人的作品,属于开源的:http://smithhtmleditor.codeplex.com/

    2. FlowDocument/XAML 和 HTML之间的转换,其实官方是有一个例子的,只不过,肯定的是,XAML和HTML之间相互转肯定是有样式和标记不支持而被忽略的:

    http://msdn.microsoft.com/en-us/library/aa972129.aspx  你可以直接下载Windows SDK 7.0 然后安装后里面的例子包中就能找到。


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 xiangl_hz 2012年6月13日 7:27
    2012年6月13日 3:43
    版主
  • 很喜欢Frame里装html,html里放CKEditor的方法,这样起手非常简单。我直接用了WebBrowser(因为不需要frame的其他功能),固定呈现CKEditor目录里的一个html文件,文件里包含了ckeditor,就基本能工作了。(还没想好部署方面的问题,把整个ckeditor目录显示给最终用户似乎不大好)

    找到一些C#代码调用WebBrowser呈现的html网页内的script的例子,那么获得ckeditor的编辑结果就没问题了。

    除了部署,目前还碰到2个问题,目前还没头绪:

    1、安全性提示,我修改了系统里 internet选项-->高级-->允许活动内容 之后,运行程序还会出现安全提示。WebBrowser有啥属性能够关闭这个提示吗?

    2、如果要扩展CKEditor的功能,有没有一种方法,让javascript反过来调用C#的方法?

    2012年6月13日 7:38
  • 2个问题都解决了

    1、在本地html文件的头部<header>前加一行

    <!-- saved from url=(0014)about:internet -->

    2、WebBrowser.ObjectForScripting可以传入一个对象给Javascript使用,Javascript里用window.external.方法 的方式调用C#公开的对象。另外赋值给ObjectForScripting的类,需要[System.Runtime.InteropServices.ComVisibleAttribute(true)]附加属性,类似

        [System.Runtime.InteropServices.ComVisibleAttribute(true)]//将该类设置为com可访问
        public class ObjectForJava
        {
            public void Test()
            {
                System.Windows.MessageBox.Show("in Test");
            }
        }

        ......

        webBrowser1.ObjectForScripting = new ObjectForJava();

    则,Javascript里可以通过

    window.external.Test();

    调用C#里的Test方法

    2012年6月13日 9:55