簡體   English   中英

如何將純文本和RTF文本的混合添加到RichTextBox

[英]How to add a mixture of plain text and RTF text to a RichTextBox

我有一個小型應用程序,用於跟蹤用戶制作的副本。
然后,我希望能夠在RTF文本框中輸出復制歷史記錄。

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

這些是我打的電話。
getAllentriesFormated()循環一個添加用戶已復制內容的列表。
因此,您可以使用以下格式的字符串結尾

“ RTF文字

普通文字”

問題在於它將顯示RTF文本,但會引發異常,因為我給它提供了同時使用RTF文本和常規文本格式化的字符串。

因此,我的問題是,如何同時顯示兩者? 我可以用
copyDisplay.Text = toDisplay但它顯示用於編碼RTF文本的文本。
提前致謝!

而不是使用純文本和RTF來創建連接字符串,而是嘗試弄清楚哪些部分是什么,為什么不返回字符串列表,然后將每個字符串附加到RichTextBox ,測試以查看每個字符串是RTF還是純文本? 如果您擔心富文本框在添加文本時不斷閃爍並重繪,則可以采用以下方法中的解決方案: 如何防止RichTextBox刷新其顯示? 為了防止這種情況:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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