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 以利用它。
将 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 以利用它。