[英]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.