2009-04-17 10 views
3

Je souhaite afficher le curseur sablier et désactiver la fenêtre pendant qu'un processus BackgroundWorker s'exécute dans un autre thread.WPF Wait Cursor avec BackgroundWorker Thread

C'est ce que je fais:

Private Sub MyButton_Click(...) 
    Dim box As New AnotherWpfWindow() 
    box.Owner = Me 
    ... 
    box.ShowDialog() 
    If (box.DialogResult.GetValueOrDefault = True) Then 
     Me.IsEnabled = False 
     Me.Cursor = Cursors.Wait 
     MyBackgroundWorker.RunWorkerAsync() 
    End If 
End Sub 

Private Sub MyBackgroundWorker_RunWorkerCompleted(...) 
    UpdateInterface() 
    Me.IsEnabled = True 
    Me.Cursor = Cursors.Arrow 
End Sub 

La fenêtre devient invalide comme je veux, mais le curseur reste une flèche. Comment puis-je en faire le curseur d'attente?

Il semble fonctionner pour vg1890 selon cette question: Disabling all but one control in a WPF window

Répondre

8

Ce qui semble se passer ici est que WPF ignore le réglage du curseur sur la fenêtre désactivée. La solution suivante semble fonctionner: au lieu de désactiver la fenêtre elle-même, désactivez le contenu de la fenêtre:

C#:

((UIElement)Content).IsEnabled = false; 
Cursor = Cursors.Wait; 

// and in RunWorkerCompleted handler: 
((UIElement)Content).IsEnabled = true; 
Cursor = Cursors.Arrow; 

Visual Basic:

DirectCast(Content, UIElement).IsEnabled = False 
Cursor = Cursors.Wait 

' and in RunWorkerCompleted handler:' 
DirectCast(Content, UIElement).IsEnabled = True 
Cursor = Cursors.Arrow 
+0

C'est fait. Je vous remercie. –

11

Une autre façon est de changer le curseur globalement, est ..

Mouse.OverrideCursor = Cursors.Wait; 

//Do something 
//... 

Mouse.OverrideCursor = null;