Windows.Forms.RichTextBox失去表格背景颜色

7

将rtf文件加载到Windows Forms RichTextBox中时,表格单元格的背景色会丢失。如果我们使用WPF RichTextBox并加载相同的文件,则一切都格式正确。

我在将文件加载到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();
            }
        }

    }

这是两个版本的屏幕截图: enter image description here 提前感谢任何帮助。
史蒂夫。

1
感谢您的评论,这些代码片段来自我创建的快速测试项目,以便我们可以解决一个更大的项目中使用语句的问题。 - SteveP
1个回答

11
有许多版本的RichTextBox,Winforms锁定了早期版本2.0。它可以回溯到.NET 1.x和.NET 2.0版本,这些版本仍然可以在像98这样的古老Windows版本上运行。v2.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创建的一个样例表格显示得非常完美:

enter image description here


更新:此代码现在已经内置到Winforms中,目标至少为版本4.7以利用它。


嗨,汉斯,非常感谢你的回答,它完美地运行了。 - SteveP
我遇到了一个问题,即在Windows 10上从Word/Excel等应用程序中复制的图像显示为白色。我尝试了这个方法,似乎解决了问题。谢谢。 - okud
偶尔微软的某个人仍会对WinForms进行更新。 WinForms已死,长存WinForms! - LarsTech
非常感谢这个解决方案。它很好地解决了缺少JPEG和PNG图像的问题(如\pict\jpegblip)。 - WarpEnterprises

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接