2013-03-25 52 views
1

我有一個自定義控件(繼承自TextBox),我正在.NET 4.0中工作。C#用戶輸入後的時間延遲

我需要做的是在用戶完成輸入後執行一些代碼,例如,他停止打字後一秒鐘。

爲了效率和每次文本更改,我都無法執行此代碼塊,因爲它有點費時。理想情況下,每次用戶啓動和停止輸入時只應調用一次。我已經開始在OnTextChanged方法內使用StopwatchRestart()

這裏是我的設置:

public class MyBox : TextBox 
{ 
    private readonly Stopwatch timer; 

    protected override void OnTextChanged(TextChangedEventArgs e) 
    { 
     timer.Restart(); 

     base.OnTextChanged(e); 
    } 
} 

我怎樣纔能有效地做到這一點?異步線程是否是答案?或者有其他方法嗎?

+0

[無擴展名(http://msdn.microsoft.com/en-us/library/hh229400(V = vs.103)的.aspx)是目前做到這一點的最好辦法,但圖書館很難理解。 .net 4.5綁定上的 –

+0

具有完全這樣的Delay屬性。 – majocha

回答

6

您可以輕鬆地做到使用DispatcherTimer

public class MyBox : TextBox 
{ 
    private readonly DispatcherTimer timer; 

    public MyBox() 
    { 
     timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) }; 
     timer.Tick += OnTimerTick; 
    } 

    protected override void OnTextChanged(TextChangedEventArgs e) 
    { 
     timer.Stop(); 
     timer.Start(); 
    } 

    private void OnTimerTick(object sender, EventArgs e) 
    { 
     timer.Stop(); 
     // do something here 
    } 
} 
+0

+1只需通過勾號擊敗我。 –

+0

工作就像一個魅力!謝謝 – Joseph

0

如果您的代碼可以在單獨的線程上運行,那麼設計您的線程代碼,以便通過殺死線程來殺死它。然後在每次按鍵時,殺死舊線程(如果存在)並用您的代碼重新啓動一個新線程。注意:如果您的代碼需要與UI線程交互,那麼您必須確保調用回主線程,或者使用基本爲您執行的「UpdateStatus」調用。

或者,你的計時器方法可以工作,但是當它執行時會發出警告,主線程將被鎖定直到完成,因此我的第一個可終止線程的建議。

1

使用帶有Delay綁定。示例:

<StackPanel> 
    <TextBox Text="{Binding ElementName=TextBlock, 
          Path=Text, 
          Delay=1000}" /> 
    <TextBlock x:Name="TextBlock" /> 
</StackPanel> 
+1

不錯,但只適用於.Net 4.5+ –