【发布时间】:2018-07-30 14:13:52
【问题描述】:
我在 WPF 中使用 C#.net 应用程序,其中我们有很多昂贵的操作。最近我们有这个要求:对于长时间运行的进程,显示忙碌光标直到 3 秒,如果操作超过 3 秒,则显示启动屏幕,直到操作完成。我在网上搜索了很多,但似乎没有什么相关的。任何支持将不胜感激。
我们已经尝试了一些方法,它可以工作,但在少数情况下它没有给出预期的结果。任何帮助将不胜感激。 当我的内部逻辑显示任何警报消息并等待用户输入时,忙碌光标功能计时器继续运行,我们也得到了启动。
public class BusyCursor:IDisposable
{
private Cursor _previousCursor;
System.Timers.Timer _timer
public BusyCursor()
{
_previousCursor = Mouse.OverrideCursor;
Mouse.OverrideCursor = Cursors.Wait;
_timer = new System.Timers.Timer();
_timer.Interval = 3000;
_timer.Elapsed += timer_Tick;
_timer.Start();
}
public void timer_Tick(object sender, ElapsedEventArgs e)
{
Application.Current.Dispatcher.Invoke((new Action(() =>
{
if (!DXSplashScreen.IsActive)
{
DXSplashScreen.Show<TrippsSplashScreen>();
}
Mouse.OverrideCursor = Cursors.Arrow;
_timer.Stop();
})), DispatcherPriority.ApplicationIdle);
}
#region IDisposable Members
public void Dispose()
{
_timer.Stop();
if (DXSplashScreen.IsActive)
{
DXSplashScreen.Close();
}
Mouse.OverrideCursor = Cursors.Arrow;
}
#endregion
}
Usage:
using (new BusyCursor())
{
//logic ---
}
谢谢
【问题讨论】:
-
在过去的 20 多年里,相关文章已有数 千篇。这在 VB6、Winforms 和 WPF 教程中有描述。 Async in 4.5: Enabling Progress and Cancellation in Async APIs 展示了自 .NET 4.5 以来如何执行此操作。在 VB6 和 .NET 3.5 之前,您需要 BackgroundWorker 来完成类似的操作
-
在 WPF 中您不需要也不应该直接修改 UI。将您的 UI 绑定到模型,例如 ProgressModel。您可以将不同的视图绑定到同一个模型,甚至在运行时更改视图,例如,仅在开始时将光标更改为 Cursor.Wait 并将其
Progress属性绑定到状态进度条的视图。如果一个事件在 3 秒后到达,它可以使用除了状态进度条之外的对话框视图 -
Dossible 重复 WPF - display Hourglass when application is busy
标签: c# wpf splash-screen busy-cursor