[英]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.