Редактор HTML в приложении Windows Forms

Нам нужен элемент управления редактором WYSIWYG для нашего приложения Windows (vb.net или C#), чтобы пользователи могли создавать электронные письма в формате HTML (для отправки с использованием объектов SMTP в структуре dot net) перед отправкой.

В настоящее время все доступные редакторы, которые мы можем найти, имеют одну из следующих проблем:

  1. Они полагаются на mshtml.dll или элемент управления веб-браузера, ненадежный для нас, поскольку код HTML и редактор не синхронизируются под Windows 2000 (IE6).

  2. Это веб-интерфейс, а не элемент управления в форме окна.

  3. Они помещают стили в заголовок документа (см. Примечание ниже)

К сожалению, поскольку эта статья электронной почты HTML описывает, единственный надежный способ заставить электронные письма HTML работать со стилями - это использовать их встроенными, что сейчас, похоже, не поддерживается многими редакторами.

Кто-нибудь имеет в этом опыт или может предложить решение?

Ответов (5)

Это мой первый вклад.

Вы можете использовать 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

Самый простой редактор HTML в Windows Forms может отображать <div contenteditable="true"></div> в WebBrowser элементе управления. Он имеет встроенную поддержку общих функций редактирования текста HTML, таких как:

  • Ctrl+ Bсделать выделение жирным
  • Ctrl+ Iсделать выделение курсивом
  • Ctrl+ Uсделать выделенный фрагмент подчеркнутым
  • Ctrl+ Aвыделить весь текст
  • Ctrl+ Cскопировать выделение
  • Ctrl+ Xвырезать выделение
  • Ctrl+ Vвставить выделение
  • Ctrl+ Kвставить ссылку

Однако для лучшего пользовательского опыта вы можете полагаться на DOM document объекта WebBrower и использовать его execCommandметод и легко запускать команды типа Bold, Italic, Underline, InsertOrderedList, InsertUnorderedList, InsertImage, FormatBlock, ForeColor, BackColor, и т.д.

Например, следующая команда вставляет упорядоченный список:

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

Examlpe - HTML-редактор Windows Forms

Здесь я поделюсь примером приложения C# и покажу вам, как легко можно реализовать редактор HTML.

введите описание изображения здесь

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, достаточно иметь элемент WebBrowser управления Form и инициализировать редактор следующим образом:

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

Затем вы можете использовать a, 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);
            }
        }
    }
}

Мне также понадобился редактор WYSIWYG для проекта Windows Forms, над которым я работал. Я писал о найденных здесь предметах . В конце концов, я использовал то, что нашел в CodeProject: текстовый редактор на основе Windows Forms с выводом HTML . Это нарушает пункт (а) выше, поскольку он использует элемент управления WebBrowser. Однако я не смог найти ничего хорошего, что не делало бы этого (если вы каким-то образом не используете WebBrowser, то вам в основном придется написать свой собственный анализатор и рендерер HTML, чтобы обрабатывать "What-You- См. "Часть WYSIWYG). Преимущество этого элемента управления заключается в том, что исходный код легко настраивается, поэтому вы можете убирать и добавлять параметры форматирования по мере необходимости (и если вы хотите, чтобы все стили были встроенными, вы также можете это сделать).

Я использовал этот , который немного ниже, чем WebBrowser, но по-прежнему использует MSHTML, который выдает уродливый HTML. Для моих целей я делаю редактор с несколькими вкладками с WYSIWYG и режимом редактирования HTML (с использованием ICSharp.TextEditor ) с классом Buffer для обновления при изменении вкладок. Как часть этого класса Buffer, я фактически запускаю HTML через HTML Tidy и несколько битов scrub-n-replace, чтобы получить действительный XHTML.

Я предлагаю это только как решение, потому что мне тоже не удалось найти решение, которое не было бы каким-то образом заимствовано из MSHTML, и в конечном итоге просто продолжил работу с указанным выше решением, чтобы продолжать двигаться вперед.

Вместо поиска редактора HTML рассмотрите вариант редактора RichText (который может быть намного проще создать), а затем преобразуйте окончательный текст в документ HTML.

При условии, что вам необходимо использовать минимальный набор функций (полужирный / курсив и т. Д.), Создание редактора RT и преобразование окончательного документа в формат HTML не должно быть трудным.

Если, с другой стороны, вам нужно использовать больше функций (например, таблицы), вам необходимо изучить формат Rich Text Format и реализовать необходимые функции.

Дополнительные ресурсы: