【问题标题】:WPF ComboBox 延迟过滤
【发布时间】:2011-08-23 19:47:40
【问题描述】:

考虑以下情况: 有组合框和过滤器文本框,然后用户在文本框中键入文本组合框项目源使用过滤器文本更新。一切正常,但过滤会发生在每个键入的字母上。我想在过滤发生之前添加延迟(用户键入时不应用过滤器)。最简单的方法是什么?

【问题讨论】:

  • 我不记得这一分钟确切的计时器类,所以不写答案。但是在您的视图模型中(如果您正在执行 MVVM),您可以让数据更新启动计时器,而不是直接应用于组合框。确保将其设置为仅触发一次,并在每次输入数据时重置。例如,将其设置为 500 毫秒。然后它只会在用户暂停输入后 500 毫秒更新。我在自定义文件系统目录选择器自动完成文本框控件(ala 运行提示符)上使用了这种方法。它运行良好,并且很容易消除错误。
  • @Merlyn 谢谢你,我也会试试这个方法。
  • 我相信这与接受的答案或多或少相同。希望对你有效。干杯!
  • @Merlyn 实际上在测试了我发现的两种方法之后,你的方法更方便,因为它不需要 'TimeSinceType' 变量和 '*_TextChanged' 方法中的额外检查。
  • 哦,我明白了。我将在今天晚些时候将此添加为答案。我有点作弊,因为他的回答让我想起了要使用的计时器类;)

标签: c# wpf asynchronous filter


【解决方案1】:

这样做最常用的方法是引入一个计时器,每次用户输入一个新字符时,您的时间跨度都会重置,但如果它长于 x 秒,则执行代码。

记住要异步执行,这样如果用户在您执行搜索时再次开始输入,您可以取消异步调用,因为该信息现在已经过时了。

如果您使用的是视图模型,只需将 textbox1_TextChanged 更改为适当的属性设置器

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (!tmr.Enabled)
        {
            tmr.Enabled = true;
            tmr.Start();
        }


        TimeSinceType = DateTime.Now;

    }

public DateTime TimeSinceType { get; set; }

protected void Load()
{
      tmr = new Timer();
      tmr.Interval = 200;
      tmr.Elapsed += new ElapsedEventHandler(tmr_Elapsed);
}

void tmr_Elapsed(object sender, ElapsedEventArgs e)
{
    if ((DateTime.Now - TimeSinceType).Seconds > .5)
    {
        Dispatcher.BeginInvoke((Action)delegate()
        {
            //LoadData();
            tmr.Stop();
        });
    }
}

【讨论】:

  • 谢谢,完全符合我的需要。但是,我将 Dispatcher.BeginInvoke 替换为 Dispatcher.Invoke。搜索速度足够快,只是在用户输入时无需执行。
  • 需要调度员调用吗?如果你没有线程错误(UI 线程),你会得到它吗?
  • 是的,如果你要在 UI 线程上更新一些东西,你实际上可以很容易地尝试这个,你会看到它抛出一个 InvalidOperationException:调用线程无法访问这个对象,因为不同的线程拥有它。
  • @Merlyn Dispatcher 需要正确更新 WPF 控件。请参阅此处的备注部分:msdn.microsoft.com/en-us/library/ms591206.aspx
  • 在计算经过的时间增量时,应该是 .TotalSeconds,而不是 .Seconds。如果您不知道其中的区别,那么您可能会引入难以追踪的细微错误。
【解决方案2】:

现在可以通过直接在绑定上设置延迟来更轻松地完成此操作:

<ComboBox Text={Binding MyBinding, Delay=200} />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2014-10-31
    • 2014-02-28
    相关资源
    最近更新 更多