当前位置:  开发笔记 > 编程语言 > 正文

Windows.Forms.RichTextBox丢失表背景色

如何解决《Windows.Forms.RichTextBox丢失表背景色》经验,为你挑选了1个好方法。

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

将文件加载到Windows窗体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();
            }
        }

    }

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

在此先感谢您的帮助。

史蒂夫。



1> Hans Passant..:

RichTextBox有许多版本,Winforms锁定在早期版本2.0中。回到.NET 1.x和.NET 2.0,这些版本仍可以在Windows 98等古代Windows版本上运行。v2.0中缺少对表的支持。

这是可以修复的,升级版本不需要太多代码。XP或更高版本提供5.0版。您所需要做的就是加载本机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中,至少要针对4.7版本才能利用它。

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有