Windows.Forms.RichTextBox 失去 table 背景颜色

Windows.Forms.RichTextBox Loses table background colours

将 rtf 文件加载到 Windows Forms RichTextBox 时,它会丢失 table 单元格的背景颜色。如果我们使用 WPF RichTextBox 并加载相同的文件,则所有内容都按应有的格式设置。

当我将文件加载到 Windows Forms RichTextBox 时,我是否遗漏了什么?

Windows 表单 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();
            }
        }

    }

这是两个版本的屏幕截图:

在此先感谢您的帮助。

史蒂夫。

RichTextBox 有很多版本,Winforms 锁定在早期版本 2.0。回到 .NET 1.x 和 .NET 2.0,这些版本在古老的 Windows 版本(如 98)上仍然可以 运行。在 v2.0 中缺少对 table 的支持。

这非常容易修复,升级版本不需要太多代码。 5.0 版可在 XP 及更高版本上使用。您所要做的就是加载本机 DLL,msftedit.dll 而不是 riched20.dll,这样 "RichEdit50W" window class 就可用了。并覆盖 CreateParams 以使用 class.

向您的项目添加一个新的 class 并粘贴如下所示的代码。编译。您可以从工具箱顶部放下新控件,替换旧控件。

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 创建的示例 table 呈现完美:


更新:此代码现在 built-in 到 Winforms,目标至少版本 4.7 以利用它。