在例程中更新UI控件(TextBlock)

时间:2018-06-13 17:32:29

标签: wpf vb.net

如何在例程中更新UI? 例如:

Private sub foo()
    myTextBlock.Text = "Phase 1"
    DoSomething
    myTextBlock.Text = "Phase 2"
    DoSomething
End Sub  

更具体,更复杂,第1阶段是使用WebClient下载文件,第2阶段是执行该文件,但只有在下载完成后才能启动。

2 个答案:

答案 0 :(得分:0)

我认为您无法看到UI更新,因为您的 DoSomething Sub正在主(UI)线程中执行。请尝试使用Async / Await。

下面是文件下载的模拟:

MainWinwow.xaml

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Test Window" Height="200" Width="400"
        Loaded="Window_Loaded">
    <StackPanel>
        <TextBlock x:Name="TextBlockControl" />
    </StackPanel>
</Window>

MainWindow.xaml.cs

Class MainWindow
    Private Async Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
        TextBlockControl.Text = "Downloading file..."
        Await Task.Run(Sub() DownloadFile())
        TextBlockControl.Text = "Reading file..."
        Await Task.Run(Sub() ReadFile())
        TextBlockControl.Text = "Finished :)"
    End Sub

    Private Sub ReadFile()
        Threading.Thread.Sleep(2000)
    End Sub

    Private Sub DownloadFile()
        Threading.Thread.Sleep(1500)
    End Sub

End Class

另外考虑使用Binding,在WPF中,Binding就是这样。

答案 1 :(得分:-1)

WPF是关于数据绑定的,但是,您也可以在代码中设置它。

首先,在XAML中为控件命名:

    <TextBlock
        x:Name="myTextBlock">
    </TextBlock>

要使用x:Name,必须包含以下命名空间

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

现在,您可以在代码中使用您的控件(在本例中为myTextBlock):

    myTextBlock.Text = "Phase 1"