Нет ли простого способа установить текст StatusBar в WPF?

Я хочу установить текст TextBlock в моей StatusBar, прежде чем заставить пользователя ненадолго подождать, пока моя программа выполнит небольшую работу.

По-видимому, вместо того, чтобы делать миленькую функцию вроде этой (которая не работает):

Function Load(ByVal Id As Guid) As Thing
    Cursor = Cursors.Wait
    TextBlockStatus.Text = "Loading..."
    TextBlockStatus.UpdateLayout()
    Dim Found = From t In db.Thing _
                Where t.Id = Id _
                Select t
    TextBlockStatus.Text = String.Empty
    Cursor = Cursors.Arrow
    Return Found
End Function

Вместо этого я должен использовать это чудовище:

Private WithEvents LoadWorker As BackgroundWorker

Private Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    InitializeLoadWorker()
End Sub

Private Sub InitializeLoadWorker()
    LoadWorker = New BackgroundWorker
    LoadWorker.WorkerSupportsCancellation = False
    LoadWorker.WorkerReportsProgress = False
    AddHandler LoadWorker.DoWork, AddressOf LoadBackgroundWorker_DoWork
    AddHandler LoadWorker.RunWorkerCompleted, AddressOf LoadBackgroundWorker_RunWorkerCompleted
End Sub

Sub Load(ByVal Id As Guid)
    Cursor = Cursors.Wait
    LoadWorker.RunWorkerAsync(Argument)
End Sub

Private Sub LoadBackgroundWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
    Dim Worker As BackgroundWorker = DirectCast(sender, BackgroundWorker)
    Dim Id As Guid = DirectCast(e.Argument, Guid)
    e.Result = From t In db.Thing _
               Where t.Id = Id _
               Select t
End Sub

Private Sub LoadBackgroundWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
    TextBlockStatus.Text = String.Empty
    Cursor = Cursors.Arrow
    Dim Found As Thing = DirectCast(e.Result, Thing)
    'now do something with the found thing here instead of where Load() is called.'
End Sub

И функция Load() теперь является Sub!!

Должен быть лучший способ справиться с такой простой ситуацией. Это не должно быть асинхронным.

1 ответ

Решение

Посмотрите на этот вопрос: Показать экран ожидания в WPF.

Принятый ответ имеет способ делать то, что я думаю, что вы хотите, без фона рабочего класса.

По ссылке в ответе на другой вопрос, это может работать для VB.NET (хотя я не пробовал)

Public Sub AllowUIToUpdate()

    Dim frame As New DispatcherFrame()

    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Render, New DispatcherOperationCallback(AddressOf JunkMethod), frame)

    Dispatcher.PushFrame(frame)

End Sub

Private Function JunkMethod(ByVal arg As Object) As Object

    DirectCast(arg, DispatcherFrame).Continue = False
    Return Nothing

End Function
Другие вопросы по тегам