如何在 WPF 应用程序启动期间显示等待光标?
Posted
技术标签:
【中文标题】如何在 WPF 应用程序启动期间显示等待光标?【英文标题】:How do I display wait cursor during a WPF application's startup? 【发布时间】:2012-06-16 19:07:40 【问题描述】:以下是我希望在 WPF 应用程序启动时发生的基本事件。这与 Word 在我的机器上的启动方式非常相似。
-
显示忙碌光标。
执行基本初始化。这需要几秒钟,并且需要在显示初始屏幕之前完成。
显示闪屏。此初始屏幕显示更深入初始化的进度,可能需要一段时间(缓存来自数据库的信息)。
显示默认光标。由于启动画面现在正在显示进度,因此无需显示忙碌光标。
启动画面进度完成后,显示主窗口。
关闭初始屏幕。
除了在显示初始屏幕之前显示忙碌光标外,一切正常。当我通过快捷方式执行应用程序时,等待光标闪烁,但很快又回到默认值。我尝试了不同的方法来设置光标,但没有任何效果,但我认为问题在于我不在控件/窗口中——我是在 App.xaml.cs 中进行的。而且,我设置的属性似乎是 Windows 窗体属性。这是我在 App.xaml.cs 中的代码的摘录。
protected override void OnStartup(StartupEventArgs e)
base.OnStartup(e);
System.Windows.Forms.Application.UseWaitCursor = true;
//System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor;
//System.Windows.Forms.Application.DoEvents();
Initialize();
SplashWindow splash = new SplashWindow();
splash.Show();
System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;
// Right now I'm showing main window right after splash screen but I will eventually wait until splash screen closes.
MainWindow main = new MainWindow();
main.Show();
【问题讨论】:
【参考方案1】:这应该可以工作
Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
使用System.Windows.Input
而不是System.Windows.Forms
。
【讨论】:
添加了它,它仍然和以前一样。如果我在最初设置 OverrideCursor 后没有将其重置为 null,则当我将光标放在窗口上时会显示等待光标。但是,它不会在应用程序最初启动时显示。 嗯,我已经玩了一段时间了,在实际窗口之外更改光标似乎非常困难(即使不是不可能)(即使使用此代码,您也会注意到等待鼠标离开窗口时光标消失)。抱歉,我无法提供更多帮助。 这很好。只需设置 this.Cursor 值只会为 Window 更改它,如果您将鼠标悬停在控件上,您将获得默认光标而不是等待光标。 Mouse.OverrideCursor 似乎为 Window 及其中的所有内容设置了等待光标。【参考方案2】:如果您的任务需要花费大量时间,并且它在非 GUI 线程上运行(这是一个好主意),您可以使用以下代码来更改应用程序光标:
Application.Current.Dispatcher.Invoke(() =>
Mouse.OverrideCursor = Cursors.Wait;
);
当繁忙的进程完成时,使用这个:
Application.Current.Dispatcher.Invoke(() =>
Mouse.OverrideCursor = null;
);
【讨论】:
【参考方案3】: Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
InitializeComponent();
...
Mouse.OverrideCursor = null;
【讨论】:
【参考方案4】:我假设 Initialize() 是您希望忙碌光标出现的部分,是吗?
如果是这样,请尝试以下方法:
-
在 MainWindow.xaml 中的
<Window>
元素上,设置以下属性:Visibility="Hidden"
和 Cursor="Wait"
。
在 MainWindow.xaml.cs 中,将初始化代码移出构造函数并移入公共 Initialize() 方法,这样任何依赖于 Initialize() 调用的代码都不会被执行。确保 Initialize() 方法的末尾将 Visiblity
属性设置为 Visible
并重置 Cursor
。
将上面发布的代码 sn-p 更新为如下内容:
protected override void OnStartup(StartupEventArgs e)
base.OnStartup(e);
MainWindow main = new MainWindow();
main.Show(); // this should set the cursor how you want it
Initialize();
SplashWindow splash = new SplashWindow();
splash.Show();
main.Initialize(); // now invoke the Initialize method you created
// Right now I'm showing main window right after splash screen but I will eventually wait until splash screen closes.
【讨论】:
【参考方案5】:对我来说,它混合了上述内容:
class MyForm : System.Windows.Window
class Test
MyForm myForm;
void ShowWaitCurserInMyForm()
//before kicking off the stuff I'm waiting for:
System.Windows.Forms.Application.UseWaitCursor = true; // disables all Input from the mouse
myForm.Cursor = System.Windows.Input.Cursors.Wait; // actually displays a wait Cursor
// do time intensive stuff here, if we wait for an event, following stuff belongs in its handler
System.Windows.Forms.Application.UseWaitCursor = false; // reenables all Input from the mouse
myForm.Cursor = null; // reset the Cursor visually
【讨论】:
以上是关于如何在 WPF 应用程序启动期间显示等待光标?的主要内容,如果未能解决你的问题,请参考以下文章
将鼠标光标更改为等待光标,然后启动工作线程并在线程完成时改回