功能不按顺序触发

时间:2013-01-26 18:31:05

标签: c# wpf xaml soap

WPF和c#爱好者的新手......

出于某种原因,我无法在按下按钮之后和SOAP调用之前立即运行我的loadingAnimation(或任何其他)函数。

我的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();
    }

我的SoapCall()似乎在txtResults.Text有时间填充之前运行。 SoapCall()大约需要5秒钟才能返回一条消息。我已经搞乱了对象的顺序,但无济于事。

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

原因是SoapCall()阻止了UI线程。换句话说,在完成之前 - 不会调用任何UI操作。

您可以将SoapCall()放在 BackgroundWorker 中来解决此问题。 然后,ShowHideLoading可以放在RunWorkerCompleted事件中。

以下是how to use the BackgroundWorker

的示例

答案 1 :(得分:0)

当您对主线程(在这种情况下,调用_Click方法的线程)执行操作时,UI将在调用完成之前实际更新,并且框架会警告UI重绘自身。您从未看到更新的原因是因为SoapCall阻止主线程执行任何更新。

为了使其正常工作,我建议更新UI,分支新线程以执行Soap调用,然后在操作完成时,将UI重置回其原始状态。

您可能还想了解如何正确使用Dispatcher对象,因为WPF要求在主线程上进行所有UI更新。 Dispatcher允许您强制在特定线程上运行一段代码。