【问题标题】:Windows.Forms.RichTextBox Loses table background coloursWindows.Forms.RichTextBox 丢失表格背景颜色
【发布时间】:2015-12-18 14:42:30
【问题描述】:

将 rtf 文件加载到 Windows 窗体 RichTextBox 时,它会丢失表格单元格的背景颜色。如果我们使用 WPF RichTextBox 并加载相同的文件,那么所有内容都会按照应有的格式进行格式化。

将文件加载到 Windows 窗体 RichTextBox 时是否遗漏了什么?

Windows 窗体 RichTextBox 代码 sn -p :

    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 );
            }
        }
    }

在上面的代码sn-p中我也试过用

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

richTextBox1.LoadFile(fDialog.FileName);

WPF RichTextBox 代码 sn-p

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

    }

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

提前感谢您的帮助。

史蒂夫。

【问题讨论】:

  • 感谢 cmets,sn-ps 取自我创建的快速测试项目,因此我们可以在更大的项目中解决问题,我们正在使用 using 语句。

标签: c# .net wpf winforms richtextbox


【解决方案1】:

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


更新:此代码现在是 Winforms 的 built-in,目标至少为 4.7 版才能利用它。

【讨论】:

  • 嗨,汉斯,非常感谢您的回答,效果很好
  • 我遇到了一个问题,从 Word/Excel/.. 在 Windows 10 上粘贴的图像显示为白色图像。我试过这个,它似乎工作得很好。谢谢。
  • 所以每隔一段时间,微软的某个人仍然会更新 WinForms。 WinForms 已死,WinForms 万岁!
  • 非常感谢这个解决方案。它效果很好,还解决了缺少 jpeg 和 png 图像的问题(例如 \pict\jpegblip)。
猜你喜欢
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2011-01-26
  • 2018-10-14
  • 2011-10-06
相关资源
最近更新 更多