2012-06-13 24 views
14

ここでは、WPFアプリケーションの起動時に発生したい基本イベントを示します。これは、Wordがマシン上でどのように起動するかと非常によく似ています。WPFアプリケーションの起動時に待機カーソルを表示するにはどうすればよいですか?

  1. ビジーカーソルを表示します。
  2. 基本的な初期化を実行します。これには数秒かかり、スプラッシュ画面が表示される前に完了する必要があります。
  3. スプラッシュ画面を表示します。このスプラッシュ画面には詳細な初期化の進捗状況が表示され、しばらく時間がかかります(データベースから情報をキャッシュする)。
  4. デフォルトのカーソルを表示します。スプラッシュ画面に進行状況が表示されているので、ビジーカーソルを表示する必要はありません。
  5. スプラッシュ画面の進行が完了したら、メインウィンドウを表示します。
  6. スプラッシュ画面を閉じます。

スプラッシュ画面が表示される前にビジーカーソルが表示されている場合を除き、すべてが正常に動作します。ショートカットを使ってアプリケーションを実行すると、待機カーソルが点滅しますが、すぐにデフォルトに戻ります。 Cursorを設定するにはさまざまな方法を試しましたが、機能はありませんが、問題は私がコントロール/ウィンドウにないことだと思います.App.xaml.c内からやっています。そして、私が設定しているプロパティはWindowsフォームのプロパティのようです。 App.xaml.cのコードから抜粋したものです

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(); 
} 

答えて

38

これは

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

使用System.Windows.InputないSystem.Windows.Formsを動作するはずです。

+0

追加したことと、それはまだ前と同じように動作します。 OverrideCursorを最初に設定した後にnullにリセットしないと、ウィンドウにカーソルを合わせると待機カーソルが表示されます。しかし、アプリが最初に起動しているときは表示されません。 – bsh152s

+0

ええと、私はしばらくそれをしてきましたが、実際のウィンドウの外にカーソルを変更することは不可能ではないにしても非常に難しいようです(このコードでも、マウスが離れると待機カーソルが消えます窓)。申し訳ありませんが、私はもっと助けになることはできませんでした。 –

+0

これは良いことです。 this.Cursor値を設定するだけで、ウィンドウの値が変更されます。コントロール上にカーソルを置くと、待機カーソルではなくデフォルトのカーソルが表示されます。 Mouse.OverrideCursorは、ウィンドウとその中のすべての待機カーソルを設定しているようです。 –

18

あなたはかなりの時間がかかり、あなたがアプリケーションのカーソルを変更するには、このコードを使用することができます(良い考えである)、非GUIスレッドで実行されているタスクがある場合:

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

忙しいプロセスが完了し、この使用:私は(初期化を想定してい

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

は)はい、あなたは忙しいカーソルがのために表示したい部分ですか?

その場合は、次のようなアプローチしてみてください:Visibility="Hidden"Cursor="Wait":あなたMainWindow.xamlで

  1. を、<Window>要素に、次のプロパティを設定します。あなたのMainWindow.xaml.csで
  2. 、初期化()の呼び出しに依存して任意のコードが実行されないように、コンストラクタの外に、公共の初期化()メソッドに初期化コードを移動します。 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. 
} 
0
 Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; 
     InitializeComponent(); 
     ... 
     Mouse.OverrideCursor = null; 
関連する問題