1

アプリケーションの一部をバックグラウンドで実行し、サブがバックグラウンドで実行されている間にユーザーが UI を更新できるようにする必要があります。検索したところ、WPF では Dispatcher を使用する必要があることがわかりました。問題は、ディスパッチャーを使用しても、すべてのサブが終了するまで GUI が使用できないことです。ここにコードを添付して、私の意味をよりよく理解できるようにします。たとえば、このコードでは、ユーザーがアプリケーションを実行すると、システムは最初のテキストボックスのテキストを変更する新しいスレッドを実行する必要がありますが、使用中は 2 番目のテキストボックスのテキストを更新できます。私はこれを正しく行っているかどうか疑問に思っています。誰でもこれで私を助けることができますか?

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:testDispacher"
Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
<Grid>
    <StackPanel>
        <TextBlock>UCtextbox:</TextBlock>
        <src:ToBeRunByDispacherUC x:Name="UC1" />
        <TextBlock>Windowstxtbox:</TextBlock>
        <TextBox x:Name="txtBox2" Width="100" Height="30"/>
    </StackPanel>
</Grid>

Class Window1 
Delegate Sub runSub()
Dim setTxt As runSub
Public Sub New()
    InitializeComponent()
    setTxt = AddressOf UC1.setTxtBox
End Sub
Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    UC1.IsEnabled = False
    Dispatcher.Invoke(setTxt, Windows.Threading.DispatcherPriority.Background)
End Sub

クラス終了

<UserControl x:Class="ToBeRunByDispacherUC"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
    <TextBox x:Name="txtBox1" Width="100" Height="30"/>
</Grid>

Partial Public Class ToBeRunByDispacherUC

Public Sub setTxtBox()
    Dim j As Integer = 0
    For i As Integer = 0 To 10
        j += 1
        System.Threading.Thread.Sleep(1000)
    Next
    txtBox1.Text = "End"
    Me.IsEnabled = True
 End Sub
End Class
4

2 に答える 2

0

一般的なアプリケーションに呼び出すことができます。

Application.Current.Dispatcher.Invoke()
于 2015-02-19T15:51:56.870 に答える