Winforms 为什么不是';richtextbox是否正确显示此表?

Winforms 为什么不是';richtextbox是否正确显示此表?,winforms,richtextbox,rtf,Winforms,Richtextbox,Rtf,显然,微软提供的RichTextBox并不完全支持RTF规范。由于某些原因,它不允许多行,反而会破坏格式 例如,以下是生成表的RTF代码: \par \trowd\trgaph108\trleft36\trqc\trrh280\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3 \cellx2000\cellx4000\cellx6000\cellx6500\cellx8500\cellx9000\cellx11000 \pard\intbl Length of

显然,微软提供的RichTextBox并不完全支持RTF规范。由于某些原因,它不允许多行,反而会破坏格式

例如,以下是生成表的RTF代码:

\par
\trowd\trgaph108\trleft36\trqc\trrh280\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3
\cellx2000\cellx4000\cellx6000\cellx6500\cellx8500\cellx9000\cellx11000
\pard\intbl Length of Time until Replayment\cell\cell Flate Fee Percentage\cell\cell Broker and Application Fees\cell\cell Total lien on case\cell\row
\trowd\trgaph108\trleft36\trqc\trrh280\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3
\cellx2000\cellx4000\cellx6000\cellx6500\cellx8500\cellx9000\cellx11000
\pard\intbl 0-6 \cell Months \cell 40% \cell\cell 310 \cell\cell\{#TOTALLIEN0-6#\}\cell\row
\trowd\trgaph108\trleft36\trqc\trrh280\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3
\cellx2000\cellx4000\cellx6000\cellx6500\cellx8500\cellx9000\cellx11000
\pard\intbl 7-12 \cell Months \cell 60% \cell\cell 310 \cell\cell\{#TOTALLIEN7-12#\} \cell\row
\trowd\trgaph108\trleft36\trqc\trrh280\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3
\cellx2000\cellx4000\cellx6000\cellx6500\cellx8500\cellx9000\cellx11000
\pard\intbl 13-18 \cell Months \cell 100% \cell\cell 310 \cell\cell\{#TOTALLIEN13-18#\} \cell\row
\trowd\trgaph108\trleft36\trqc\trrh280\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3
\cellx2000\cellx4000\cellx6000\cellx6500\cellx8500\cellx9000\cellx11000
\pard\intbl 19-24 \cell Months \cell 150% \cell\cell 310 \cell\cell\{#TOTALLIEN19-24#\} \cell\row
\trowd\trgaph108\trleft36\trqc\trrh280\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3
\cellx2000\cellx4000\cellx6000\cellx6500\cellx8500\cellx9000\cellx11000
\pard\intbl 25-36 \cell Months \cell 200% \cell\cell 310 \cell\cell\{#TOTALLIEN25-36#\} \cell
\row\trowd\trgaph108\trleft36\trqc\trrh280\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3
\cellx2000\cellx4000\cellx6000\cellx6500\cellx8500\cellx9000\cellx11000
\pard\intbl 37+ \cell Months \cell 300% \cell\cell 310 \cell\cell\{#TOTALLIEN37#\} \cell
如果同时使用word和写字板,则此功能可以正常工作。文本过长的顶行分成多个单元行,但是,在Richtext框中,它做了一些奇怪的事情

写字板如下所示:

Richtext框如下所示:


如何使richtextbox正常工作?

我找到了解决方案。显然,每个系统上都有不止一个RichEdit库,并且默认为旧版本(我认为是4.0)。5.0解决了RTF解释的大部分问题。要获取使用它的RichtextBox,必须禁用RichtextBox并重载CreateParams属性

我是这样做的:

public partial class FullRichtextBox : RichTextBox {
    public FullRichtextBox() :base() {
        InitializeComponent();
    }
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr LoadLibrary(string lpFileName);

    protected override CreateParams CreateParams {
        get {
            CreateParams param = base.CreateParams;
            if (LoadLibrary("msftedit.dll") != IntPtr.Zero) {
                param.ClassName = "RICHEDIT50W";
            }
            return param;
        }
    }
}

我最近遇到了一个类似的问题,虽然公认的答案有效,但我也在这个堆栈溢出问题上找到了一个有趣的解决方案:



这意味着我可以继续在最新的RichTextBox中使用.NET 4.5.2,而无需创建自定义类等。不过,我可能应该在某个时候更新到.NET 4.7+。

还有一个,它可以更好地处理滚动条:顶部答案,谢谢这次选择实际上是失败的。对于解决方案,我希望我能投15票给你的解决方案:)这个解决方案太棒了。非常感谢。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
   <startup>
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
   </startup>
   <runtime>
      <AppContextSwitchOverrides
         value="Switch.System.Windows.Forms.DoNotLoadLatestRichEditControl=false" />
   </runtime>
</configuration>