2009-04-17 10 views
3

BackgroundWorkerプロセスが別のスレッドで実行されているときに、砂時計カーソルを表示してウィンドウを無効にしたいとします。WPFでBackgroundWorkerスレッドでカーソルを待機

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 

を私が望むようなウィンドウが無効になったが、カーソルが矢印のまま:

これは私がやっているものです。どのようにしてそれを待ちカーソルにすることができますか?

それはこの質問に応じvg1890のために働くようだ:Disabling all but one control in a WPF window

答えて

8

ここで起こっているように見える何WPFが無効になって窓にカーソル設定を無視しているということです。次の回避策が動作しているようです:代わりにウィンドウ自体を無効にする、ウィンドウの内容を無効にします。

の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

それでした。ありがとうございました。 –

11

もう一つの方法はにありますカーソルをグローバルに変更すると、..

Mouse.OverrideCursor = Cursors.Wait; 

//Do something 
//... 

Mouse.OverrideCursor = null; 
関連する問題