winforms C# RTF到纯文本,RichTextBox不工作

vjrehmav  于 2023-01-31  发布在  C#
关注(0)|答案(1)|浏览(206)

我们使用外部组件(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,即最新的非测试版。

ve7v8dk2

ve7v8dk21#

如果您想试用RICHEDIT20W版本的RichEdit控件(Rich Text Edit Control v. 3.1),请使用像这样构建的自定义控件。它尝试加载riched20.dll库,如果成功,则在CreateParams重写中设置控件的类名。
您还可以尝试加载通常随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);
}

相关问题