簡體   English   中英

C# RTF 到純文本與 RichTextBox 不工作

[英]C# RTF to plain text with RichTextBox not working

我們使用外部組件 ( MigraDoc ) 來編寫一個 RTF 文檔。 然后通過將 RTF 作為字符串分配給System.Windows.Forms.RichTextBoxRtf字段並讀取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 版本和位數

實際上,您可以使用特定版本的控件。
調整此代碼,使其按照您的喜好運行。 實際上,它允許在版本之間切換。 RICHEDIT20WRICHEDIT50W (設計時或運行時)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM