关于WPF中UserControl的问题
我用了一个有Loading效果的UserControl
平时调用的时候 效果正常。。
现在我想实现一个功能。。 我现在假设 一个Button的事件 要执行5秒,我想在这5秒间执行这个loading的效果。。可是 我在头和尾巴 加上这个代码后。。貌似这个Loading动画 会卡住 。。然后直接消失。。没有达到想要的效果:
this.loading.Visibility = Visibility.Visible;
...执行代码
this.loading.Visibility = Visibility.Collapsed;
这个动画 在执行代码的时候 就不能动了- - 求解释。。
[最优解释]
简单解释一下。主线程中,只需要开始你的loading的显示,并且向系统线程池注册一下需要调用abc,这就行了。因此这个过程一瞬间就执行完毕了,主线程就可以给其它操作使用,不会造成界面卡住的现象。
然后你的方法abc在适当的时候(通常是立刻)被系统线程池执行,(子线程)它进行你要的计算操作,计算完毕再给主线程注册一个用来隐藏loading的方法(这里是采用了匿名方法的写法),这也是一瞬间不等loading隐藏也就执行完毕了。
然后最后,系统主线程的消息泵当轮询到那个消息请求,会执行这个隐藏loading的匿名方法。
整个过程中,涉及loading的两条语句在主线程执行,abc中的计算语句在子线程上执行。
[其他解释]
如果你用的是4.5的版本
你可以看下 async 和 await
private async void button1_Click(object sender, EventArgs e)
{
// ExampleMethodAsync returns a Task.
await ExampleMethodAsync();
textBox1.Text += "\r\nControl returned to Click event handler.\r\n";
}
async Task ExampleMethodAsync()
{
// The following line simulates a task-returning asynchronous process.
await Task.Delay(1000);
}
this.loading.Visibility = Visibility.Visible;
ThreadPool.QueueUserWorkItem(h=> abc());
private void abc()
{
...执行代码
this.Dispatcher.BeginInvoke(delegate()
{
this.loading.Visibility = Visibility.Collapsed;
});
}