Windows.Forms.RichTextBox Теряет цвета фона таблицы

При загрузке rtf-файла в RichTextBox Windows Forms он теряет цвет фона ячеек таблицы. Если мы используем RichTextBox WPF и загружаем тот же файл, все форматируется так, как должно.

Я что-то упускаю, когда загружаю файл в Windows Forms RichTextBox?

Фрагмент кода Windows Forms RichTextBox:

    private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog fDialog = new System.Windows.Forms.OpenFileDialog();
        fDialog.Filter = "Rich Text Files (*.rtf)|*.rtf";
        fDialog.Multiselect = false;
        fDialog.RestoreDirectory = true;
        if (fDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            if (fDialog.FileName != "")
            {
                richTextBox1.LoadFile(fDialog.FileName, RichTextBoxStreamType.RichText );
            }
        }
    }

В приведенном выше фрагменте кода я также пытался использовать

richTextBox1.Rtf = File.ReadAllText(fDialog.FileName);

и

richTextBox1.LoadFile(fDialog.FileName);

Фрагмент кода WPF RichTextBox

    private void load_file_Click(object sender, RoutedEventArgs e)
    {
        System.Windows.Forms.OpenFileDialog fDialog = new System.Windows.Forms.OpenFileDialog();
        fDialog.Filter = "Rich Text Files (*.rtf)|*.rtf";
        fDialog.Multiselect = false;
        fDialog.RestoreDirectory = true;
        if (fDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            if (fDialog.FileName != "")
            {
                FileStream fStream;
                fStream = new FileStream(fDialog.FileName, FileMode.Open, FileAccess.Read, FileShare.Read);

                richtextbox1.SelectAll();
                richtextbox1.Selection.Load(fStream, DataFormats.Rtf);
                fStream.Close();
            }
        }

    }

Вот скриншот обеих версий: введите здесь описание изображения

Заранее благодарю за любую помощь.

Стив.


person SteveP    schedule 18.12.2015    source источник
comment
Спасибо за комментарии, фрагменты были взяты из проектов быстрого тестирования, которые я создал, чтобы мы могли исправить проблему в гораздо более крупном проекте, где мы используем операторы использования.   -  person SteveP    schedule 18.12.2015


Ответы (1)


Было много версий RichTextBox, Winforms заблокирована в раннем выпуске, версия 2.0. Восходит к .NET 1.x и .NET 2.0, версиям, которые все еще могли работать в старых версиях Windows, таких как 98. Поддержка таблиц в версии 2.0 отсутствует.

Это в высшей степени поправимо, для обновления версии не требуется много кода. Версия 5.0 доступна для XP и выше. Все, что вам нужно сделать, это загрузить собственную DLL, msftedit.dll вместо riched20.dll, чтобы стал доступен класс окна «RichEdit50W». И переопределите CreateParams, чтобы использовать этот класс.

Добавьте новый класс в свой проект и вставьте код, показанный ниже. Скомпилировать. Вы можете удалить новый элемент управления из верхней части панели инструментов, заменив старый.

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class RichTextBox5 : RichTextBox {
    protected override CreateParams CreateParams {
        get {
            if (moduleHandle == IntPtr.Zero) {
                moduleHandle = LoadLibrary("msftedit.dll");
                if ((long)moduleHandle < 0x20) throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not load Msftedit.dll");
            }
            var cp = base.CreateParams;
            cp.ClassName = "RichEdit50W";
            return cp;
        }
    }
    private static IntPtr moduleHandle;

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr LoadLibrary(string lpFileName);
}

Образец таблицы, которую я создал с помощью Word, отображается идеально:

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


ОБНОВЛЕНИЕ: этот код теперь построен -in для Winforms, ориентируйтесь как минимум на версию 4.7, чтобы воспользоваться ею.

person Hans Passant    schedule 18.12.2015
comment
Привет Ганс, большое спасибо за ваш ответ, он отлично работает - person SteveP; 18.12.2015
comment
Я столкнулся с проблемой, что вставленные изображения из Word/Excel/.. в Windows 10 отображаются как белое изображение. Я попробовал это, кажется, работает хорошо. Спасибо. - person okud; 25.06.2019
comment
Так что время от времени кто-то из Microsoft все еще обновляет WinForms. WinForms мертв, да здравствует WinForms! - person LarsTech; 27.06.2019
comment
Большое спасибо за это решение. Он отлично работает, а также решает проблему отсутствия изображений в формате jpeg и png (например, \pict\jpegblip). - person WarpEnterprises; 28.07.2020