2009-04-17 2 views
3

Я хочу показать курсор песочных часов и отключить окно, в то время как процесс BackgroundWorker запускается в другом потоке.WPF Wait Cursor With BackgroundWorker Thread

Это то, что я делаю:

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 

окно отключается, как я хочу, но курсор остается стрелка. Как я могу сделать это курсором Wait?

Это похоже на работу для 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;