1、概述
在WinForm开发中,您可能会碰到发送邮件时内容编辑的问题,大部分开发人员第一个想法是希望将 WinForm中的内容编辑器做到和.NET
中类似FCK一样。今天我们就来介绍下如何实现和FCK一样的内容编辑器功能。
2、正文
邮件内容编辑器的问题,在网上搜索一下,碰到这个的问题的人还不少,大多数开发者参考的下面这篇文章中的内容:http://www.codeproject.com/cs/miscctrl/editor_in_windows_forms.asp且不说这篇文章中实现的方法的好坏。但里面包含的Microsoft.MSHTML.dll,动辄7M多,实在是让人看了不舒服。又或是利用WindowsLive.Writer.Interop.Mshtml和WindowsLive.Writer.Mshtml两个组件来实现,维护起来相当麻烦,代码就更不好看懂了。今天我向大家介绍一种新的内容编辑器的实现,彻底解决上述的问题,总大小不过几百KB。
首先我们来分析下实现的原理。在上述那个例子中,它利用C#中的webBrowser控件和HTML交互达到的内容编辑器的效果,但它的实现却是需要去完成单个单个的功能最后组合而成,例如,实现剪切的功能的核心代码:
2 {
3 webBrowser1.Document.ExecCommand("Cut", false, null);
4 }
5 public void Bold()
6 {
7 webBrowser1.Document.ExecCommand("Bold", false, null);
8 }
这种方法是不是太过复杂?!而且维护起来也不方便。既然是webBrowser和HTML的交互实现原来,那为什么我们不直接做一个纯HTML的邮件编辑器,然后再来和webBrowser交互呢?!这就是我今天要介绍方法的核心原理。下面我们来看看它的实现过程:
第一步:纯HTML内容编辑器
其实这一步最简单,基本上您在网上搜索HTML内容编辑器,就会有一大堆出现在您面前。既然是纯HTML的,记住一定是双击既可以打开预览的。如图:
当然了,我们还是要写一点必要的JS,便于获取和设置从webBrowser控件传出来的内容。
//获取邮件内容
function GetContent(){
return editor.html();
}
function GetTitile(){
return document.getElementById('txttile').value;
}
function GetFileUrl(){
return document.getElementById('txtfile').value;
}
function SetTitile(arg){
document.getElementById('txttile').value=arg;
}
function SetContent(arg){
editor.html(arg);}
</script>
第二步:内容交互
这里比较简单,就是一个从webBrowser1中执行JS函数的核心代码:
webBrowser1.Document.InvokeScript("SetContent", objArray);
其他部分,没什么好说明的,直接看代码吧。
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using System.Security.Permissions; //需加的
10
11 namespace EmailEdit
12 {
13 [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]//需加的
14 [System.Runtime.InteropServices.ComVisibleAttribute(true)]//需加的
15 public partial class SendEmail : Form
16 {
17 public SendEmail()
18 {
19 InitializeComponent();
20 }
21
22 private void SendEmail_Load(object sender, EventArgs e)
23 {
24 webBrowser1.Navigate(Application.StartupPath + "/edit/editemail.html");
25 }
26
27 //获取邮件信息
28 private void button1_Click(object sender, EventArgs e)
29 {
30 string strtitle = webBrowser1.Document.InvokeScript("GetTitile").ToString();
31 string strfile = webBrowser1.Document.InvokeScript("GetFileUrl").ToString();
32 string strcontent = webBrowser1.Document.InvokeScript("GetContent").ToString();
33 MessageBox.Show("邮件的标题是:" + strtitle + "\n" + "附件:" + strfile + "\n" + "内容:" + strcontent);
34 }
35
36 //设置邮件信息
37 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
38 {
39 //邮件标题
40 string strtitle = "这是标题";
41 Object[] objArray = new Object[1];
42 objArray[0] = (Object)strtitle;
43 webBrowser1.Document.InvokeScript("SetTitile", objArray);
44
45 //邮件内容
46 string name = @"<font color=""#FF0000""><h1>hello world</h1></font>!sendry lee.";
47 objArray = new Object[1];
48 objArray[0] = (Object)name;
49 webBrowser1.Document.InvokeScript("SetContent", objArray);
50 }
51 }
52 }
第三步:运行
看实现的效果和图片吧:
如果对您有帮助别忘了分享给其他人,感谢您的阅读!