我正在开发Windows Phone应用程序。 我有一个性能非常强的方法,需要几秒钟才能完成操作。
当调用该方法时,我想显示一个动画加载符号,该符号在我的视图的xaml中定义。操作完成后,它应该消失。我将加载符号设置为在此方法的第一行中可见。在最后一行中,我将可见性设置为折叠。
问题在于,首先将执行整个代码。遗憾的是,没有任何东西可以被看到,因为在执行操作代码之后,visibiliy被设置为可见,并且在同一时刻它被设置为崩溃。
有谁知道如何解决这个问题?非常感谢提前。
答案 0 :(得分:2)
你遇到的问题是你在主(UI)线程上调用你的方法。这意味着您的方法会阻止UI刷新,并且还意味着(如您所知)在UI 执行刷新时,您已经再次隐藏了该图标。
你需要做的是在后台线程上调用你的方法(有很多方法可以解决这个问题)。您需要将UI更新推送到UI线程(使用Dispatcher.Invoke
),但您的方法的其余部分将在单独的线程上运行。
您还需要使用某种类型的回调 - 也许是自定义事件 - 以便您的UI线程知道后台线程何时完成。
答案 1 :(得分:-1)
如果没有看到代码很难确定,但是如果在设置繁忙指示符后使用调度程序运行密集代码,则可以在运行代码之前更改ui线程时间。
一个例子
//This assumes you are binding in xaml to the isbusy and it implements INotifyPropertyChanged
IsBusy = true;
Dispatcher.BeginInvoke(()=>{ //...performance intense here
});
那就是说Dan Puzey是对的。如果出于某种原因需要,您应该只在UI线程上运行此逻辑。即便如此,也要警惕这一点,因为它会带来糟糕的ui体验。
您可以通过一种方式完成此操作,并在您需要时将调度程序关闭,将调度程序的副本传递给后台。
ThreadPool.QueueUserWorkItem (d => {
//...performance intense here
Dispatcher dispatcher = d as Dispatcher;
if(dispatcher != null){
dispatcher.BeginInvoke()()=>{//...ui updates here }
}
}, Dispatcher.CurrentDispatcher);//make sure this is called from your UI thread or you may not end up with the correct dispatcher