[英]C# RTF to plain text with RichTextBox not working
我们使用外部组件 ( MigraDoc ) 来编写一个 RTF 文档。 然后通过将 RTF 作为字符串分配给System.Windows.Forms.RichTextBox
的Rtf
字段并读取Text
字段,将其转换为纯文本。 这在早些时候起作用,但现在我们发现了一个问题(已经存在一段时间了)。
纯文本转换在 Windows 10 上不起作用,但同一应用程序在 Windows 7 上起作用。分配Rft
字段后, Text
字段保持为空,并且Rft
字段也没有刚刚分配的值。 *
但是,我们应用程序的早期版本也适用于 Windows 10。 即使在这方面也没有直接的本构变化。 一个可能影响的变化是 .Net 目标版本从 4.0 更改为 4.7.2(但很难再验证这一点)。
如果我从 Windows 7 中获取 RTF 字符串并将其另存为文件,它会在 Windows 7 上的写字板中打开。但它不会在 Windows 10 上的写字板上打开。
有其他人分阶段处理过类似的问题吗? 或者有什么想法可以解决这个问题吗?
* 但取而代之的是价值:
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}
{\*\generator Riched20 10.0.19041}\viewkind4\uc1
\pard\f0\fs17\par
}
编辑: MigraDoc 版本是 1.32,即最新的非测试版。
如果您想试用 RichEdit 控件的RICHEDIT20W
版本(富文本编辑控件 v. 3.1),请使用像这样构建的自定义控件。 它尝试加载riched20.dll
库,如果成功,则在CreateParams
覆盖中设置控件的 Class 名称。
您也可以尝试加载通常随 MS Office 安装一起提供的RICHEDIT60W
版本以进行测试。 这个版本也有不同的行为。
在这种情况下,您必须提供库的完整路径,这取决于安装的 Office 版本和位数
实际上,您可以使用特定版本的控件。
调整此代码,使其按照您的喜好运行。 实际上,它允许在版本之间切换。 RICHEDIT20W
和RICHEDIT50W
(设计时或运行时)
using System.ComponentModel;
using System.Runtime.InteropServices;
public class RichTextBox20W : RichTextBox {
private bool m_UseRichedit20 = true;
public RichTextBox20W() {
IsRichEdit20Available = LoadLibrary("riched20.dll") != IntPtr.Zero;
}
[DefaultValue(true)]
public bool UseRichedit20 {
get => m_UseRichedit20 & IsRichEdit20Available;
set {
if (value != m_UseRichedit20) {
m_UseRichedit20 = value;
RecreateHandle();
}
}
}
public bool IsRichEdit20Available { get; }
protected override CreateParams CreateParams {
get {
var cp = base.CreateParams;
if (UseRichedit20) {
cp.ClassName = "RICHEDIT20W";
}
// If the library is not found, the class name is set to RICHEDIT50W
// which is the default when targeting .NET Framework 4.7.2+
return cp;
}
}
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern IntPtr LoadLibrary(string lpLibFileName);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.