Подтвердить что ты не робот

Как отображать курсор ожидания во время запуска приложения WPF?

Вот основные события, которые я хочу выполнить, когда мое приложение WPF запустится. Это очень похоже на то, как Word запускается на моей машине.

  • Отобразить курсор занятости.
  • Выполните базовую инициализацию. Это займет пару секунд, и это необходимо сделать, прежде чем отобразится экран заставки.
  • Отобразить экран заставки. Этот всплеск отображает прогресс в более глубокую инициализацию и может занять некоторое время (кэширует информацию из базы данных).
  • Отобразить курсор по умолчанию. Так как всплывающий экран теперь показывает прогресс, нет необходимости отображать курсор занятой.
  • Как только заставка заставки будет завершена, отобразите главное окно.
  • Закрыть экран заставки.

Все работает отлично, за исключением отображения загруженного курсора перед отображением заставки. Когда я запускаю приложение через ярлык, курсор ожидания мигает, но вскоре возвращается к умолчанию. Я пробовал разные способы установить Cursor, но никто не работает, но я думаю, что проблема в том, что я не в элементе управления/окнах - я делаю это из App.xaml.cs. И свойства, которые я устанавливаю, кажутся свойствами Windows Forms. Вот отрывок из моего кода в 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();
}
4b9b3361

Ответ 1

Это должно работать

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

Используйте System.Windows.Input not System.Windows.Forms.

Ответ 2

Если у вас есть задача, которая занимает значительное количество времени, и она работает в потоке, отличном от GUI (это хорошая идея), вы можете использовать этот код для изменения курсора приложения:

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

Когда процесс занятости завершен, используйте это:

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

Ответ 3

Я предполагаю, что Initialize() - это часть, для которой вы хотите, чтобы ваш загруженный курсор отображался, да?

Если да, попробуйте следующий подход:

  • В вашем MainWindow.xaml в элементе <Window> задайте следующие свойства: Visibility="Hidden" и Cursor="Wait".
  • В вашем MainWindow.xaml.cs переместите код инициализации из конструктора и в открытый метод Initialize(), чтобы любой код, зависящий от вызова Initialize(), не выполнялся. Убедитесь, что конец вашего метода Initialize() устанавливает свойство Visiblity в Visible и также сбрасывает значение Cursor.
  • Обновите фрагмент кода, опубликованный выше, примерно на следующее:
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.
}

Ответ 4

        Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
        InitializeComponent();
        ...
        Mouse.OverrideCursor = null;