KeyDown事件的延迟计时器

时间:2014-09-27 13:47:46

标签: c# wpf mvvm

我的TextboxKeyDown个事件。此事件与ViewModel中的事件处理程序绑定。以下是示例代码:

<TextBox x:Name="textBox" Text="{Binding TextBoxText, UpdateSourceTrigger=PropertyChanged}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="KeyDown">
            <cmd:EventToCommand Command="{Binding Path=TextBoxKeyDownEvent}" PassEventArgsToCommand="True" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
<TextBox.InputBindings>

确实,只要用户开始在texbox中写入,就会调用ViewModel中的后端事件处理程序。但我不想为每个KeyDown操作调用事件处理程序。我想在用户开始在文本框中键入时调用事件处理程序并停止至少N毫秒。这意味着我需要为事件设置延迟计时器。任何人都可以指导我如何在MVVM中实现这一目标吗?

2 个答案:

答案 0 :(得分:5)

您可以使用BindingBase.Delay属性:

<TextBox x:Name="textBox" Text="{Binding TextBoxText, Delay=500, UpdateSourceTrigger=PropertyChanged}" />

这将在用户更改视图模型后仅500毫秒修改TextBoxText属性。然后,在您的设置器中,您可以调用任何您想要执行的代码。

private string textBoxText;
public string TextBoxText
{
    get { return textBoxText; }
    set
    {
        // Setter will be called only 500 milliseconds after the user has entered text.
        if (textBoxText != value)
        {
            textBoxText = value;
            RaisePropertyChanged("TextBoxText");

            // Handle text change.
            DoStuff();
        }
    }
}

修改

如果您希望在代码中更改属性时发生延迟,您可以使用与此处提到的解决方案类似的内容:Timer to fire an event WPF

答案 1 :(得分:1)

设置计时器和超时事件

    private System.Timers.Timer keypressTimer = new System.Timers.Timer();
    keypressTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

在超时事件中执行您的任务 -

    private void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        keypressTimer.Stop();
        App.Current.Dispatcher.Invoke((Action)delegate
        {

            //CALL YOUR EVENT HERE

        });

    }

每按一次键 - 您需要按以下方式重置计时器。

    if (delayTime > 0)
            {
                keypressTimer.Interval = delayTime;
                keypressTimer.Start();
            }