C# 在Xaml呈现之前执行代码隐藏-如何影响序列

C# 在Xaml呈现之前执行代码隐藏-如何影响序列,c#,multithreading,silverlight,xaml,C#,Multithreading,Silverlight,Xaml,我正在开发一个Windows Phone应用程序。 我有一个非常高性能的方法,需要几秒钟才能完成操作 调用该方法时,我希望显示在视图的xaml中定义的动画加载符号。当操作完成时,它应该消失。在该方法的第一行中,我将加载符号设置为可见。在最后一行中,我将可见性设置为折叠 问题是,首先将执行所有隐藏的代码。不幸的是,什么也看不见,因为Visibility在代码隐藏操作执行后设置为visible,同时设置为Collapse 有人知道如何解决这个问题吗?非常感谢。您遇到的问题是在主(UI)线程上调用您的

我正在开发一个Windows Phone应用程序。 我有一个非常高性能的方法,需要几秒钟才能完成操作

调用该方法时,我希望显示在视图的xaml中定义的动画加载符号。当操作完成时,它应该消失。在该方法的第一行中,我将加载符号设置为可见。在最后一行中,我将可见性设置为折叠

问题是,首先将执行所有隐藏的代码。不幸的是,什么也看不见,因为Visibility在代码隐藏操作执行后设置为visible,同时设置为Collapse


有人知道如何解决这个问题吗?非常感谢。

您遇到的问题是在主(UI)线程上调用您的方法。这意味着您的方法阻止了UI刷新,也意味着(正如您所指出的)在UI刷新时,您已经再次隐藏了图标

相反,您需要做的是在后台线程上调用您的方法(有许多方法可以处理这个问题)。您需要将UI更新推送到UI线程(使用
Dispatcher.Invoke
),但方法的其余部分将在单独的线程上运行


您还需要使用某种回调(可能是自定义事件),以便您的UI线程知道后台线程何时完成。

如果没有看到代码,很难说清楚,但是如果您在设置忙指示器后使用调度程序运行密集型代码,这将允许UI线程在运行前更改时间密码

一个例子

//This assumes you are binding in xaml to the isbusy and it implements INotifyPropertyChanged
IsBusy = true;
Dispatcher.BeginInvoke(()=>{ //...performance intense here
});
说丹·普泽伊是对的。如果出于某种原因需要,您应该只在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

非常感谢您的快速回复。现在我实现了:Dispatcher.BeginInvoke(()=>{LoadProject();});加载符号现在在加载时可见,但已冻结(dos不执行动画)。我现在必须阅读如何使用busyIndicator。但我想这是WPF特有的东西,silverlight Windows Phone不提供。我看看。感谢在正确的方向上提供的好提示:)所有这些都是为了确保当前方法在UI线程上显式完成繁重的工作之前完成,这就是动画不运行的原因。不要用
调度程序运行性能高的东西,在后台线程中运行它。除了Dan的解释之外,我认为C#5异步/等待模式对这些情况有帮助。这里有一个关于Windows应用商店API的链接,但是WPF和旧手机的概念是相同的。