2011-07-12 204 views
0

我想扩展TextBox控件,因此它将以指定的延迟触发自定义事件。自定义事件的延迟触发

这里是我的代码至今:

public class DelayTextBox : TextBox 
{ 
    private Timer _delayTimer; 
    private int _threshold = 1000; 

    public DelayTextBox() 
    { 
     _delayTimer = new Timer(_threshold); 
     _delayTimer.Elapsed += new ElapsedEventHandler(_delayTimer_Elapsed); 
    } 

    public int Delay 
    { 
     set { _threshold = value; } 
    } 

    private void _delayTimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     _delayTimer.Stop(); 
     RaiseDelayedTextChangedEvent(); 
    } 

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

    private static readonly RoutedEvent DelayedTextChangedEvent = EventManager.RegisterRoutedEvent(
    "DelayedTextChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(DelayTextBox)); 

    public event RoutedEventHandler DelayedTextChanged 
    { 
     add { AddHandler(DelayedTextChangedEvent, value); } 
     remove { RemoveHandler(DelayedTextChangedEvent, value); } 
    } 

    private void RaiseDelayedTextChangedEvent() 
    { 
     RoutedEventArgs newEventArgs = new RoutedEventArgs(DelayTextBox.DelayedTextChangedEvent); 
     RaiseEvent(newEventArgs); 
    } 
} 

的问题是,每当我火RaiseDelayedTextChangedEvent(),我得到一个异常,告诉我

“调用线程不能访问这个对象因为不同的 线程拥有它。'

异常被抛出在这里:

private void RaiseDelayedTextChangedEvent() 
    { 
     RoutedEventArgs newEventArgs = new RoutedEventArgs(DelayTextBox.DelayedTextChangedEvent); 
     RaiseEvent(newEventArgs); 
    } <---- Here 

回答

0

您需要使用的调度在STA线程引发事件。

本文介绍您有http://www.switchonthecode.com/tutorials/working-with-the-wpf-dispatcher

private void RaiseDelayedTextChangedEvent() 
    { 
     RoutedEventArgs newEventArgs = new RoutedEventArgs(DelayTextBox.DelayedTextChangedEvent); 

     this.Dispatcher.BeginInvoke(
       System.Windows.Threading.DispatcherPriority.Normal, 
       (UpdateTheUI)delegate(RoutedEventArgs eArgs) 
       { 
        RaiseEvent(eArgs); 
       }, newEventArgs); 

    } 
+0

对于这种情况,情况复杂化了。使用DispatcherTimer会更容易,因为Andreas没有在代码中明确创建新线程。 –

+0

是的,在这种情况下你的答案会更好,但这是一种选择。 –

+0

真棒。像魅力一样工作。谢谢 :) – Andreas