2012-06-13 21 views
14

Estos son los eventos básicos que quiero que sucedan cuando se inicia mi aplicación WPF. Esto es muy similar a cómo se inicia Word en mi máquina.¿Cómo se muestra el cursor de espera durante el inicio de una aplicación WPF?

  1. Mostrar el cursor ocupado.
  2. Realiza la inicialización básica. Esto toma un par de segundos y debe hacerse antes de que se muestre la pantalla de bienvenida.
  3. Mostrar la pantalla de bienvenida. Esta pantalla de bienvenida muestra el progreso en una inicialización más profunda y puede llevar un tiempo (almacena información en caché de la base de datos).
  4. Mostrar el cursor predeterminado. Como la pantalla de bienvenida muestra el progreso ahora, no es necesario mostrar un cursor ocupado.
  5. Una vez que se completa el progreso de la pantalla de bienvenida, muestre la ventana principal.
  6. Cerrar la pantalla de presentación.

Todo funciona bien excepto por la visualización del cursor ocupado antes de que aparezca la pantalla de inicio. Cuando ejecuto la aplicación a través de un atajo, el cursor de espera parpadea, pero pronto vuelve al valor predeterminado. He intentado diferentes formas de configurar el Cursor, pero ninguno funciona, pero creo que el problema es que no estoy en una ventana de control, lo estoy haciendo desde App.xaml.cs. Y las propiedades que configuro parecen ser propiedades de Windows Forms. Aquí hay un extracto de mi código en 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(); 
} 

Respuesta

38

Esto debería funcionar

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

Uso System.Windows.Input no System.Windows.Forms.

+0

Agregado eso y todavía actúa igual que antes. Si no restablezco OverrideCursor en null después de que lo configuré inicialmente, el cursor de espera se muestra cuando coloco el cursor sobre la ventana. Pero no se muestra cuando la aplicación está comenzando inicialmente. – bsh152s

+0

Hmm, he estado jugando con él por un tiempo, parece que es muy difícil, si no imposible, cambiar el cursor fuera de la ventana real (notará incluso que con este código el cursor de espera se va cuando el mouse se va la ventana). Lo siento, no podría ser de más ayuda. –

+0

Esto es bueno. Simplemente establezca esto. El valor del cursor solo lo cambia para la ventana, si pasa el mouse sobre un control, obtiene el cursor predeterminado y no el cursor de espera. Mouse.OverrideCursor parece establecer el cursor de espera para la ventana y todo lo que contiene. –

18

Si usted tiene una tarea que requiere una cantidad significativa de tiempo, y que se ejecuta en un hilo no GUI, (que es una buena idea) se puede utilizar este código para cambiar el cursor aplicación:

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

Cuando el proceso se completa ocupado, utilice esto:

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

Asumo la inicialización() es la parte que desea que el cursor ocupado para que aparezca, sí?

Si es así, pruebe el siguiente método:

  1. En su MainWindow.xaml, en el elemento <Window>, establezca las siguientes propiedades: Visibility="Hidden" y Cursor="Wait".
  2. En MainWindow.xaml.cs, mueva el código de inicialización fuera del constructor y en un método público Initialize(), de modo que no se ejecute ningún código que dependa de la llamada Initialize(). Asegúrese de que el final de su método Initialize() establece la propiedad Visiblity en Visible y restablece también el Cursor.
  3. actualización publicada el fragmento de código anterior para algo como lo siguiente:
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; 
Cuestiones relacionadas