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秒钟才能返回一条消息。我已经搞乱了对象的顺序,但无济于事。
感谢任何帮助!
答案 0 :(得分:1)
原因是SoapCall()
阻止了UI线程。换句话说,在完成之前 - 不会调用任何UI操作。
您可以将SoapCall()
放在 BackgroundWorker 中来解决此问题。
然后,ShowHideLoading
可以放在RunWorkerCompleted事件中。
答案 1 :(得分:0)
当您对主线程(在这种情况下,调用_Click方法的线程)执行操作时,UI将在调用完成之前实际更新,并且框架会警告UI重绘自身。您从未看到更新的原因是因为SoapCall阻止主线程执行任何更新。
为了使其正常工作,我建议更新UI,分支新线程以执行Soap调用,然后在操作完成时,将UI重置回其原始状态。
您可能还想了解如何正确使用Dispatcher对象,因为WPF要求在主线程上进行所有UI更新。 Dispatcher允许您强制在特定线程上运行一段代码。