2015-12-11 55 views
0

我有一个小应用程序跟踪用户创建的副本。
然后,我希望能够在RTF文本框上输出复制历史记录。
如何将纯文本和RTF文本的混合添加到RichTextBox中

copyDisplay.Clear(); 
string toDisplay = myEntries.getAllEntriesFormated(); 
copyDisplay.Rtf = toDisplay; 

这些是我打的电话。
getAllentriesFormated()循环列出添加用户已复制的内容。
所以,你可以用下面的格式

字符串结束了“RTF文本

普通文本”

的问题是,它会显示RTF文本,而是因为我”,它会抛出一个异常m给它一个格式为RTF文本和普通文本的字符串。

所以,我的问题是,我怎样才能同时显示?我可以使用
copyDisplay.Text = toDisplay,但它显示了用于编码RTF文本的文本。
提前致谢!

回答

1

而不是使用纯文本和RTF进行连接字符串,然后试图梳理哪些部分是哪些,为什么不返回一个字符串列表,然后将每个附加到RichTextBox,测试每个字符串是否为RTF或纯文本?如果你关心的丰富的文本框闪烁,重绘多次被评为文本将被追加,就可以解决从How do you prevent a RichTextBox from refreshing its display?适应防止:

public static class RichTextBoxExtensions 
{ 
    public static void SetTextOrRtf(this RichTextBox richTextBox, IEnumerable<string> texts) 
    { 
     if (richTextBox == null || texts == null) 
      throw new ArgumentNullException(); 
     using (richTextBox.BeginUpdate()) 
     { 
      bool first = true; 
      richTextBox.Clear(); 
      foreach (var text in texts) 
      { 
       if (text == null) 
        continue; 
       if (first) 
        first = false; 
       else 
        richTextBox.AppendText("\n"); 
       richTextBox.Select(richTextBox.TextLength, 0); 
       if (text.IsRtf()) 
       { 
        richTextBox.SelectedRtf = text; 
       } 
       else 
       { 
        richTextBox.SelectedText = text; 
       } 
      } 
      richTextBox.SelectionStart = richTextBox.Text.Length; 
      richTextBox.ScrollToCaret(); 
     } 
    } 

    public static bool IsRtf(this string text) 
    { 
     // Adapted from http://stackoverflow.com/questions/22502924/how-to-determine-text-format-in-c-sharp 
     if (text == null) 
      return false; 
     const string rtfPrefix = @"{\rtf1"; 
     int start = 0; 
     for (; start < text.Length && Char.IsWhiteSpace(text[start]); start++) 
      ; 
     return string.Compare(text, start, rtfPrefix, 0, rtfPrefix.Length, StringComparison.Ordinal) == 0; 
    } 

    private const int WM_USER = 0x0400; 
    private const int EM_SETEVENTMASK = (WM_USER + 69); 
    private const int WM_SETREDRAW = 0x0b; 

    class ResetEventMask : IDisposable 
    { 
     readonly IntPtr oldEventMask; 
     RichTextBox richTextBox; 

     public ResetEventMask(RichTextBox richTextBox, IntPtr oldEventMask) 
     { 
      this.richTextBox = richTextBox; 
      this.oldEventMask = oldEventMask; 
     } 

     #region IDisposable Members 

     public void Dispose() 
     { 
      var richTextBox = Interlocked.Exchange(ref this.richTextBox, null); 
      if (richTextBox != null && !richTextBox.IsDisposed) 
      { 
       SendMessage(richTextBox.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); 
       SendMessage(richTextBox.Handle, EM_SETEVENTMASK, IntPtr.Zero, oldEventMask); 
      } 
     } 

     #endregion 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 

    public static IDisposable BeginUpdate(this RichTextBox richTextBox) 
    { 
     if (richTextBox == null) 
      throw new ArgumentNullException(); 
     // Adapted from http://stackoverflow.com/questions/192413/how-do-you-prevent-a-richtextbox-from-refreshing-its-display 
     SendMessage(richTextBox.Handle, WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero); 
     var oldEventMask = (IntPtr)SendMessage(richTextBox.Handle, EM_SETEVENTMASK, IntPtr.Zero, IntPtr.Zero); 
     return new ResetEventMask(richTextBox, oldEventMask); 
    } 
} 

然后调用它像:

IEnumerable<string> toDisplay = myEntries.getAllEntriesInList(); 
copyDisplay.SetTextOrRtf(toDisplay); 
+1

作品像魅力! –

相关问题