2009-04-23 12 views
0

私のプログラムが少し仕事をしている間、ユーザが少し待つ前にステータスバーにTextBlockのテキストを設定したいと思っています。 AparentlyWPF 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 

と負荷()関数今はSubです!!

このような単純な状況を処理するには、より良い方法が必要です。これは非同期である必要はありません。

+0

なぜそれが動作しません。これはVB.NETのために働くかもしれません(でも、私はそれを試していませんか)? –

+0

テキストは更新されません。 –

答えて

1

Display Wait Screen in WPFをご覧ください。

受け入れられる回答には、バックグラウンドワーカークラスなしで、自分が望むと思うようにする方法があります。他の質問への回答内のリンクから

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 
+0

VB.NETコードで更新する。 – Ray

+0

美しい。ありがとうございました! –

関連する問題