首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > CAD教程 >

关于WPF中UserControl的有关问题

2012-12-16 
关于WPF中UserControl的问题我用了一个有Loading效果的UserControl平时调用的时候 效果正常。。现在我想实现

关于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控件被其他线程占用的情况??
------其他解决方案--------------------


The calling thread cannot access this object because a different thread owns it.

总是出现这个错误

热点排行