0

WPFとc#の趣味の初心者...

何らかの理由で、loadingAnimation(またはその他の)関数をボタンを押した直後とSOAP呼び出しの前に実行できません。

私のxaml:

    <Grid>
    <TextBox Height="220" HorizontalAlignment="Left" Margin="12,79,0,0" Name="txtResults" VerticalAlignment="Top" Width="337" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="12,29,0,0" Name="txtServiceTag" VerticalAlignment="Top" Width="120" />
    <CheckBox Content="This computer's service tag" Height="16" HorizontalAlignment="Left" Margin="151,32,0,0" Name="chkThisST" VerticalAlignment="Top" Checked="chkThisST_Checked" Unchecked="chkThisST_Unchecked"/>
    <Button Content="Get Info" Height="23" HorizontalAlignment="Left" Margin="12,324,0,0" Name="btnGetInfo" VerticalAlignment="Top" Width="75" Click="btnGetInfo_Click" />
    <my:LoadingAnimation HorizontalAlignment="Center" Margin="128,154,419,127" VerticalAlignment="Center" Name="loadingAnimation" Visibility="Hidden" />
    </Grid>

私の.cs:

    private void btnGetInfo_Click(object sender, RoutedEventArgs e)
    {
        txtResults.Text = "Retrieving information..."; 
        ShowHideLoading();
        SoapCall();
        ShowHideLoading();
    }

txtResults.Textにデータが入力される前に、SoapCall()が実行されているようです。SoapCall()は、メッセージを返すのに約5秒かかります。のオブジェクトの順序をいじりましたが、役に立ちませんでした。

どんな助けでも大歓迎です!

4

2 に答える 2

1

その理由は、SoapCall()がUIスレッドをブロックしているためです。つまり、完了するまで、UI操作は呼び出されません。

これは、 BackgroundWorkerSoapCall()の内部に配置することで解決できます。次に、 をRunWorkerCompletedイベント内に配置できます。ShowHideLoading

これは、BackgroundWorkerの使用方法の例です。

于 2013-01-26T18:38:39.577 に答える
0

メインスレッド(この場合は、_Clickメソッドを呼び出すスレッド)でアクションを実行すると、呼び出しが終了するまでUIは実際には更新されず、フレームワークはUIに再描画するように警告します。更新が表示されない理由は、SoapCallがメインスレッドによる更新の実行をブロックしているためです。

これを正しく機能させるには、UIを更新し、新しいスレッドをフォークしてSoap呼び出しを実行し、操作が完了したらUIを元の状態にリセットすることをお勧めします。

また、WPFではすべてのUIの更新がメインスレッドで行われる必要があるため、Dispatcherオブジェクトを正しく使用する方法を確認することもできます。Dispatcherを使用すると、コードのスニペットを特定のスレッドで実行するように強制できます。

于 2013-01-26T18:39:03.617 に答える