如何为慢速WPF控件设置忙碌光标

时间:2014-09-29 03:48:53

标签: wpf controls busy-cursor

显示忙碌光标似乎有很多资源。

但我设法找到的所有解决方案都依赖于通过视图模型设置光标。 (即IsBusy财产,一次性WaitCursor)。

当我知道数据绑定/视图模型何时会长时间运行时,这些方法很有效。

但是我不知道如何在瓶颈是实际的WPF用户控件本身的情况下自动执行此操作?

例如:

加载控件最初是无滞后的。但是一旦使用第三方控制,每次加载时控件都会出现500毫秒的延迟。

绑定本身很快,因此,在视图模型中添加waitcursor / IsBusy是没用的,因为它不知道控件(或其任何逻辑/可视子节点)何时完成渲染。它也不应该知道,因为视图模型不应该受到视图实现的影响。

当一个或多个WPF控件忙/慢时,应用程序是否可以自动将光标设置为忙?

2 个答案:

答案 0 :(得分:0)

你可能需要这样的东西,

            var busytimer = new DispatcherTimer(
            TimeSpan.FromSeconds(1),
            DispatcherPriority.Normal,
            delegate
            {
                Process application = null;
                foreach (var process in Process.GetProcesses())
                {
                    if (process.ProcessName == "Your process name")
                    {
                        application = process;
                        break;
                    }
                }

                if (!application.Responding)
                {
                    this.Cursor = Cursors.Wait;
                }
                else
                {
                    this.Cursor = Cursors.Arrow;
                }
            },
            Application.Current.Dispatcher);

答案 1 :(得分:0)

  

当一个或多个WPF控件忙/慢时,应用程序是否可以自动将光标设置为忙?

不是真的。如果您的UI线程阻塞,您将无法更新光标,直到它被解锁,这无法实现目的。

  

绑定本身很快,因此,在视图模型中添加waitcursor / IsBusy是没用的,因为它不知道控件(或其任何逻辑/可视子节点)何时完成渲染。它也不应该知道,因为视图模型不应该受到视图实现的影响。

如果你使用IDisposable等待光标解决方案,你可以尝试安排Dispose()调用在下一个布局传递之后发生:

Dispatcher.CurrentDispatcher.BeginInvoke(
    DispatcherPriority.Loaded,
    new Action(() => waitCursor.Dispose()));