将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(); } } }
这是两个版本的屏幕截图:
在此先感谢您的帮助。
史蒂夫。
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版本才能利用它。