代码之家  ›  专栏  ›  技术社区  ›  Zack Peterson

是否没有简单的方法来设置WPF状态栏文本?

  •  0
  • Zack Peterson  · 技术社区  · 16 年前

    我想在我的状态栏中设置一个文本块的文本,然后让用户在我的程序做一点工作时稍等片刻。

    一方面,不是像这样做一个好的小功能(不起作用):

    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
    

    函数现在是一个子函数!!

    必须有更好的方法来处理这样一个简单的情况。这不需要是异步的。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Community CDub    8 年前

    看看这个问题: Display Wait Screen in 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