当前位置: 代码迷 >> Silverlight >> 关于WPF中UserControl的有关问题
  详细解决方案

关于WPF中UserControl的有关问题

热度:1583   发布时间:2013-02-26 00:00:00.0
关于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);
    }

http://msdn.microsoft.com/zh-cn/library/vstudio/bb397687.aspx
------其他解决方案--------------------------------------------------------
异步加载 怎么实现啊。。求。。。。。。。。。。
------其他解决方案--------------------------------------------------------
动画占用的是UI线程


------其他解决方案--------------------------------------------------------
你的代码 是异步的吗?
------其他解决方案--------------------------------------------------------
lz  可以看看 busyindicator 控件
------其他解决方案--------------------------------------------------------
引用:
你的代码 是异步的吗?

不是异步的。。我就是不会异步。。能举个简单的例子吗
------其他解决方案--------------------------------------------------------
比如说你的方法是abc,那么主线程中你可以写
this.loading.Visibility = Visibility.Visible;
ThreadPool.QueueUserWorkItem(h=> abc());

而你的abc中应该写类似于
private void abc()
{
    ...执行代码
     this.Dispatcher.BeginInvoke(delegate()
    {
         this.loading.Visibility = Visibility.Collapsed;
    });
}

------其他解决方案--------------------------------------------------------
引用:
简单解释一下。主线程中,只需要开始你的loading的显示,并且向系统线程池注册一下需要调用abc,这就行了。因此这个过程一瞬间就执行完毕了,主线程就可以给其它操作使用,不会造成界面卡住的现象。

然后你的方法abc在适当的时候(通常是立刻)被系统线程池执行,(子线程)它进行你要的计算操作,计算完毕再给主线程注册一个用来隐藏loading的方法(这里是采用了匿名方法的……


非常感谢。。可是 为什么总是出现 UI控件被其他线程占用的情况??
------其他解决方案--------------------------------------------------------