代码之家  ›  专栏  ›  技术社区  ›  John

Windows窗体应用程序中的HTML电子邮件编辑器

  •  20
  • John  · 技术社区  · 17 年前

    我们正在为我们的windows应用程序寻找所见即所得编辑器控件(vb.net版或者c#),这样用户可以在发送之前设计HTML电子邮件(使用dotnet框架中的SMTP对象发送)。

    目前我们可以找到的所有可用编辑器都存在以下问题之一:

    1. 他们依靠mshtml.dll或者是在windows2000(IE6)下,web浏览器控件被证明是不可靠的,就像HTML代码和编辑器不同步一样

    2. 它们是基于web的,不是windows窗体控件

    不幸的是 HTML email article 描述使HTML电子邮件与样式一起工作的唯一可靠的方法是使用它们的内联,这在许多编辑器中似乎不受支持。

    有没有人有这方面的经验或能提出解决办法?

    9 回复  |  直到 5 年前
        1
  •  3
  •   J Wynia    17 年前

    我一直在用 this one ,它比WebBrowser低一点,但仍然使用MSHTML,它确实会吐出一些难看的HTML。出于我的目的,我正在使用所见即所得和HTML编辑模式(使用 ICSharp.TextEditor run the HTML through HTML Tidy

    我只是把它作为一个解决方案,因为我也没有找到一个不是以某种方式从MSHTML派生出来的解决方案,最终只是继续使用上面的解决方案继续前进。

        2
  •  2
  •   ChrisW    15 年前

    有这个 HTML Edit Control for .NET

    它不依赖于任何web浏览器;它是一个Windows窗体控件;并且,它可以处理 style=

    <p> <h1> <ul> <table> ;但如果您愿意,可以询问我有关添加功能的问题(如中所述) Developing New Functionality

        3
  •  2
  •   Jaymin    6 年前

    我还需要一个WYSIWYG编辑器来处理Windows窗体项目。我写了我找到的东西 here . 最终,我使用了在CodeProject上找到的东西: A Windows Forms based text editor with HTML output . 这确实违反了上面的(a),因为它使用了WebBrowser控件。但是,我找不到任何不这样做的好东西(如果您不以某种方式使用WebBrowser,那么您基本上必须编写自己的HTML解析器和呈现器,以便处理所见即所得的“What you See”部分)。这个控件的好处是源代码很容易自定义,因此您可以根据需要删除并添加格式选项(如果您希望所有样式都一致,也可以这样做)。

        4
  •  1
  •   Anax    15 年前

    与其搜索HTML编辑器,不如考虑使用RichText编辑器(它更容易创建),然后将最终文本转换为HTML文档。

    Rich Text Format 并实现您需要的功能。

        5
  •  1
  •   Reza Aghaei    5 年前

    <div contenteditable="true"></div> 在一个 WebBrowser 控制。它内置了对常见html文本编辑功能的支持,如:

    • Ctrl键 B 将选定内容加粗
    • Ctrl键 + 使所选内容倾斜
    • Ctrl键 + 将所选内容加下划线
    • Ctrl键 + 选择所有文本
    • Ctrl键 + C 复制选择的步骤
    • Ctrl键 + 剪切所选内容
    • +
    • Ctrl键 + 插入链接的步骤

    但是,为了获得更好的用户体验,可以依赖DOM document WebBrower 使用它的 execCommand 方法和容易运行的命令 Bold , Italic , Underline , InsertOrderedList , InsertUnorderedList InsertImage , FormatBlock , ForeColor , BackColor ,等等。

    webBrowser1.Document.ExecCommand("InsertOrderedList", false, null);
    

    Examlpe-Windows窗体HTML编辑器

    在这里,我将分享一个C应用程序的示例,并向您展示如何轻松实现HTML编辑器。

    enter image description here

    public class HtmlEditor
    {
        WebBrowser webBrowser;
        private dynamic doc;
        private dynamic contentDiv;
        public HtmlEditor(WebBrowser webBrowserControl, string htmlContent)
        {
            webBrowser = webBrowserControl;
            webBrowser.DocumentText = @"<div contenteditable=""true""></div>";
            webBrowser.DocumentCompleted += (s, e) =>
            {
                doc = webBrowser.Document.DomDocument;
                contentDiv = doc.getElementsByTagName("div")[0];
                contentDiv.innerHtml = htmlContent;
            };
        }
        public string HtmlContent => contentDiv.InnerHtml;
        public void Bold() { doc.execCommand("bold", false, null); }
        public void Italic() { doc.execCommand("italic", false, null); }
        public void Underline() { doc.execCommand("underline", false, null); }
        public void OrderedList() { doc.execCommand("insertOrderedList", false, null); }
        public void UnorderedList() { doc.execCommand("insertUnOrderedList", false, null); }
        public void ForeColor(Color color)
        {
            doc.execCommand("foreColor", false, ColorTranslator.ToHtml(color));
        }
        public void BackColor(Color color)
        {
            doc.execCommand("backColor", false, ColorTranslator.ToHtml(color));
        }
        public void InsertImage(Image image)
        {
            var bytes = (byte[])new ImageConverter().ConvertTo(image, typeof(byte[]));
            var src = $"data:image/png;base64,{Convert.ToBase64String(bytes)}";
            doc.execCommand("insertImage", false, src);
        }
        public void Heading(Headings heading)
        {
            doc.execCommand("formatBlock", false, $"<{heading}>");
        }
        public enum Headings { H1, H2, H3, H4, H5, H6 }
    }
    

    要使用这个HTML编辑器类,只需 控件 控制 Form 并按以下方式初始化编辑器:

    HtmlEditor editor;
    private void Form1_Load(object sender, EventArgs e)
    {
        var html = @"Some html content";
        editor = new HtmlEditor(webBrowser1, html);
    }
    

    然后你可以使用 ToolStrip 显示可用命令并运行命令。例如:

    private void OrderedListButton_Click(object sender, EventArgs e)
    {
        editor.OrderedList();
    }
    
    private void ImageButton_Click(object sender, EventArgs e)
    {
        using (var ofd = new OpenFileDialog())
        {
            ofd.Filter = "Image files|*.png;*.jpg;*.gif;*.jpeg;*.bmp";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                using (var image = Image.FromFile(ofd.FileName))
                {
                    editor.InsertImage(image);
                }
            }
        }
    }
    
        6
  •  0
  •   VampireKode    11 年前

    这是我的第一份稿子。

    你可以使用RichTextBox。RTF格式足以创建电子邮件。

    我最近写了一篇关于如何将RichTextBox的内容加载并保存到硬盘上的文章。

    允许复制和粘贴。它使用简单,只需几个按钮就可以创建自己的命令。

    With RichTextBox1 
        .SelStart = 0 
        .SelLength = Len (. Text) 
        .SelColor = vbRed
    End With
    

    加载和保存示例。

    http://danielcatala.wordpress.com/2014/01/30/como-cargar-y-guardar-archivos-richtext-con-wpf/

    Private Sub btnCarga(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    
        Dim archivoCarga As New StreamReader("prueba.rtf")
        With RichTextBox1
            .Selection.Select(.Document.ContentStart, RichTextBox1.Document.ContentEnd)
            .Selection.Load(archivoCarga.BaseStream, System.Windows.DataFormats.Rtf)
        End With
    End Sub
    
    Private Sub btnGuarda(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click
    
        Dim archivoSalida As New StreamWriter("prueba.rtf")
        Dim bs As Stream = archivoSalida.BaseStream
    
        With RichTextBox1
            .Selection.Select(RichTextBox1.Document.ContentStart,     RichTextBox1.Document.ContentEnd)
            .Selection.Save(bs, System.Windows.DataFormats.Rtf)
        End With
    End Sub