[英]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.