2012-02-23 30 views
5

Bazı sözdizimi vurgulamak için kullanıyorum richTextBox var.RichTextBox BeginUpdate() EndUpdate() Uzantı Yöntemleri Çalışmıyor

Application.Idle += new EventHandler(Application_Idle); 

olay: bunun yerine Regex s kullanarak ve Application.Idle olay için bir olay işleyicisi kullanarak bir giriş gecikmesi tespiti üzerine güncelleştiriyorum - Bu benim özel bir sözdizimi vurgulayıcı yazmadım böylece küçük düzenleme tesistir işleyici Ben metin kutusu etkin olmadığında kez kontrol edin:

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

Ama nispeten küçük vurgular için RichTextBox ağır titrer ve hiçbir richTextBox.BeginUpdate()/EndUpdate() yöntemleri vardır. Bunun üstesinden gelmek için ben this answer to a similar dilemma by Hans Passant (Hans Passant aşağı bana izin olmamıştı!) bulundu: Ancak

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

, bu bana bir güncelleme üzerine tek bir davranış verir; imleç ölür/donar ve garip görünen çizgilerden başka hiçbir şey göstermez (aşağıdaki resme bakın).

Odd Error Caused by RichTextBox Method Extension

açıkça UI güncelleştirmek için alternatif bir iş parçacığı kullanamaz , yani ne burada yanlış yapıyorum?

Zaman ayırdığınız için teşekkür ederiz.

cevap

7

Ayrıca, daha sonra Invalidate'i de çağırmak için EndUpdate'u değiştirmeyi deneyin. Kontrol, bazı güncelleme işlemleri yapması gerektiğini bilmez, bu yüzden anlamanız gerekir:

public void EndUpdate() 
{ 
    SendMessage(this.Handle, WM_SETREDRAW, (IntPtr)1, IntPtr.Zero); 
    this.Invalidate(); 
} 
+0

Bu nane! Bir çekicilik gibi çalıştı ... Bir küçük soru, Uzatma Yöntemleri ve incelikleri hakkında nasıl öğreniyorsunuz? SendMessage (this.Handle, WM_SETREDRAW, (IntPtr) 1, IntPtr.Zero); tam olarak standart C# değil !? Yoksa öyle mi? – MoonKnight

+1

@Killercam 'SendMessage' ve Uzantıları iki farklı şeydir. 'SendMessage' bir windows API işlevi çağırıyor. Uzantılar için, bkz. [Uzantı Yöntemleri (C# Programlama Kılavuzu)] (http://msdn.microsoft.com/en-us/library/bb383977.aspx). – LarsTech

+0

Cevabınız için teşekkür ederiz. Ben ikisinin farklı olduğunu anlıyorum. Bağlantı ve yardımınız için teşekkürler, en çok takdir edilmektedir. – MoonKnight