Tôi có richTextBox mà tôi đang sử dụng để thực hiện một số cú pháp tô sáng. Đây là một cơ sở chỉnh sửa nhỏ vì vậy tôi đã không viết một highlighter cú pháp tùy chỉnh - thay vào đó tôi đang sử dụng Regex
s và cập nhật khi phát hiện có một sự chậm trễ đầu vào sử dụng một trình xử lý sự kiện cho Application.Idle
sự kiện:RichTextBox BeginUpdate() EndUpdate() Các phương thức mở rộng không hoạt động
Application.Idle += new EventHandler(Application_Idle);
trong trường hợp handler tôi kiểm tra lần vào hộp văn bản đã không hoạt động:
private void Application_Idle(object sender, EventArgs e)
{
// Get time since last syntax update.
double timeRtb1 = DateTime.Now.Subtract(_lastChangeRtb1).TotalMilliseconds;
// If required highlight syntax.
if (timeRtb1 > MINIMUM_UPDATE_DELAY)
{
HighlightSyntax(ref richTextBox1);
_lastChangeRtb1 = DateTime.MaxValue;
}
}
Nhưng ngay cả đối với điểm nổi bật tương đối nhỏ các RichTextBox
thấp thoáng nặng nề và nó không có richTextBox.BeginUpdate()/EndUpdate()
phương pháp. Để khắc phục điều này tôi thấy this answer to a similar dilemma by Hans Passant (Hans passant chưa bao giờ làm tôi thất vọng!):
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class MyRichTextBox : RichTextBox
{
public void BeginUpdate()
{
SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)0, IntPtr.Zero);
}
public void EndUpdate()
{
SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero);
}
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
private const int WM_SETREDRAW = 0x0b;
}
Tuy nhiên, điều này mang lại cho tôi hành vi kỳ quặc khi một bản cập nhật; con trỏ chết/đóng băng và không hiển thị gì ngoài các sọc tìm kiếm kỳ quặc (xem hình bên dưới).
Tôi rõ ràng là không thể sử dụng một chủ đề khác để cập nhật giao diện người dùng, vì vậy những gì tôi làm sai ở đây?
Cảm ơn thời gian của bạn.
Đó là bạc hà! Làm việc như một sự quyến rũ ... Một câu hỏi nhỏ, làm thế nào để bạn tìm hiểu về phương pháp mở rộng và sự tinh tế của họ? 'SendMessage (this.Handle, WM_SETREDRAW, (IntPtr) 1, IntPtr.Zero);' không chính xác là chuẩn C# !? Hoặc là nó? – MoonKnight
@Killercam 'SendMessage' và Tiện ích mở rộng là hai thứ khác nhau. 'SendMessage' đang gọi hàm API của cửa sổ. Đối với Tiện ích mở rộng, xem [Phương pháp khuyến nông (Hướng dẫn lập trình C#)] (http://msdn.microsoft.com/en-us/library/bb383977.aspx). – LarsTech
Cảm ơn bạn đã trả lời. Tôi nhận ra rằng hai người khác nhau. Cảm ơn bạn đã liên kết và giúp đỡ của bạn, nó được đánh giá cao nhất. – MoonKnight