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 に答える
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 に答える