30

以下是我希望在 WPF 应用程序启动时发生的基本事件。这与 Word 在我的机器上的启动方式非常相似。

  1. 显示忙碌光标。
  2. 执行基本初始化。这需要几秒钟,需要在显示初始屏幕之前完成。
  3. 显示闪屏。此初始屏幕显示更深入初始化的进度,可能需要一段时间(缓存来自数据库的信息)。
  4. 显示默认光标。由于启动屏幕现在正在显示进度,因此无需显示忙碌光标。
  5. 启动屏幕进度完成后,显示主窗口。
  6. 关闭启动画面。

除了在显示初始屏幕之前显示繁忙光标外,一切正常。当我通过快捷方式执行应用程序时,等待光标闪烁,但很快又恢复到默认值。我尝试了不同的方法来设置光标,但没有奏效,但我认为问题在于我不在控件/窗口中——我是在 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();
}
4

5 回答 5

62

这应该工作

Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;

System.Windows.Input不使用System.Windows.Forms

于 2012-06-13T18:54:56.733 回答
46

如果您的任务需要花费大量时间,并且它在非 GUI 线程上运行(这是一个好主意),您可以使用以下代码更改应用程序光标:

Application.Current.Dispatcher.Invoke(() =>
{
    Mouse.OverrideCursor = Cursors.Wait;
});

当繁忙的过程完成时,使用这个:

Application.Current.Dispatcher.Invoke(() =>
{
    Mouse.OverrideCursor = null;
});
于 2014-10-30T19:54:55.777 回答
4
        Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
        InitializeComponent();
        ...
        Mouse.OverrideCursor = null;
于 2017-07-12T14:11:48.437 回答
2

我假设 Initialize() 是您希望忙碌光标出现的部分,是吗?

如果是这样,请尝试以下方法:

  1. 在 MainWindow.xaml 中,在<Window>元素上设置以下属性:Visibility="Hidden"Cursor="Wait".
  2. 在 MainWindow.xaml.cs 中,将初始化代码移出构造函数并移到公共 Initialize() 方法中,这样任何依赖于 Initialize() 调用的代码都不会被执行。确保 Initialize() 方法的末尾将Visiblity属性设置为Visible并重置Cursor
  3. 将上面发布的代码片段更新为如下所示:
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.
}
于 2015-03-06T03:04:27.807 回答
0

对我来说,它使用了上述内容的混合:

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
   }
}
于 2020-04-16T12:42:28.297 回答