/// <summary>附加文本到文本控件末尾。主要解决非UI线程以及滚动控件等问题</summary> /// <param name="txt">控件</param> /// <param name="msg">消息</param> /// <param name="maxLines">最大行数。超过该行数讲清空控件</param> /// <returns></returns> public static TextBoxBase Append(this TextBoxBase txt, String msg, Int32 maxLines = 1000) { if (txt.IsDisposed) { return(txt); } var func = new Action <String>(m => { try { if (txt.Lines.Length >= maxLines) { txt.Clear(); } // 记录原选择 var selstart = txt.SelectionStart; var sellen = txt.SelectionLength; // 输出日志 if (m != null) { //txt.AppendText(m); // 需要考虑处理特殊符号 //ProcessBell(ref m); //ProcessBackspace(txt, ref m); //ProcessReturn(txt, ref m); m = m.Trim('\0'); // 针对非Windows系统到来的数据,处理一下换行 if (txt is RichTextBox && Environment.NewLine == "\r\n") { // 合并多个回车 while (m.Contains("\r\r")) { m = m.Replace("\r\r", "\r"); } //while (m.Contains("\n\r")) m = m.Replace("\n\r", "\r\n"); //m = m.Replace("\r\n", "<TagOfLine>"); m = m.Replace("\r\n", "\n"); //m = m.Replace("\r", "\r\n"); m = m.Replace("\n\r", "\n"); // 单独的\r换成\n //if (_line.IsMatch(m)) // m = _line.Replace(m, "\n"); m = m.Replace("\r", "\n"); //m = m.Replace("\r", null); //m = m.Replace("<TagOfLine>", "\r\n"); } if (String.IsNullOrEmpty(m)) { return; } txt.AppendText(m); } // 如果有选择,则不要滚动 if (sellen > 0) { // 恢复选择 if (selstart < txt.TextLength) { sellen = Math.Min(sellen, txt.TextLength - selstart - 1); txt.Select(selstart, sellen); txt.ScrollToCaret(); } return; } txt.Scroll(); } catch { } }); //txt.Invoke(func, msg); var ar = txt.BeginInvoke(func, msg); //ar.AsyncWaitHandle.WaitOne(100); //if (!ar.AsyncWaitHandle.WaitOne(10)) // txt.EndInvoke(ar); return(txt); }
/// <summary>附加文本到文本控件末尾。主要解决非UI线程以及滚动控件等问题</summary> /// <param name="txt">控件</param> /// <param name="msg">消息</param> /// <param name="maxLines">最大行数。超过该行数讲清空控件</param> /// <returns></returns> public static TextBoxBase Append(this TextBoxBase txt, String msg, Int32 maxLines = 1000) { if (txt.IsDisposed) { return(txt); } var func = new Action <String>(m => { try { if (txt.Lines.Length >= maxLines) { txt.Clear(); } // 记录原选择 var selstart = txt.SelectionStart; var sellen = txt.SelectionLength; // 输出日志 if (m != null) { //txt.AppendText(m); // 需要考虑处理特殊符号 //ProcessBell(ref m); //ProcessBackspace(txt, ref m); //ProcessReturn(txt, ref m); m = m.Trim('\0'); if (String.IsNullOrEmpty(m)) { return; } txt.AppendText(m); } // 如果有选择,则不要滚动 if (sellen > 0) { // 恢复选择 if (selstart < txt.TextLength) { sellen = Math.Min(sellen, txt.TextLength - selstart - 1); txt.Select(selstart, sellen); txt.ScrollToCaret(); } return; } txt.Scroll(); } catch { } }); //txt.Invoke(func, msg); var ar = txt.BeginInvoke(func, msg); //ar.AsyncWaitHandle.WaitOne(100); //if (!ar.AsyncWaitHandle.WaitOne(10)) // txt.EndInvoke(ar); return(txt); }