繁体   English   中英

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

[英]How to set busy cursor for slow WPF controls

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

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

当我知道我的数据绑定/视图模型何时可以长时间运行时,这些方法很好用。

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

例如:

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

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

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

您可能需要这样的东西,

            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);

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

并不是的。 如果您的UI线程处于阻塞状态,则您将无法更新游标,直到它仍然变为未阻塞状态,这将无法达到目的。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM