Wpf MVVM异步加载UI控件

时间:2011-07-07 12:34:04

标签: c# asp.net wpf mvvm asynchronous

我有一个mvvm wpf应用程序,可以一次性加载一个由许多控件组成的窗口。我希望这个窗口能够单独和异步地加载控件。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

就此而言,我使用的是Singleton模式。如果您熟悉PRISM及其Bootstrapper,它就有点类似。

这里的主要思想是覆盖App.xaml中的方法OnStartup。您的xaml StartupUri="MainWindow.xaml"中会显示默认行为,您必须删除该属性。

OnStartup覆盖方法中,我使用一个创建所有对象的类(视图,ViewModel,链接DataContexts ...),并在初始化完成时触发事件。

此时我会关闭启动画面并显示一个完整加载的应用(创建InitializeComponent时会调用MainWindow,因此此时已经调用了它。)

为了更广泛的使用,您可以在窗口中添加事件,并在引导程序类中添加EventHandler。我使用它时,例如当我想完全刷新我的应用程序(重新启动它),以及数据库请求(在我的情况下,仅在应用程序启动时执行以加载引用)。

希望它有所帮助:)

答案 1 :(得分:0)

不幸的是,如果您的控件是在XAML中定义的,那么它们将使用InitializeComponent调用进行初始化并完成加载过程。加载XAML窗口的所有事件都会发生,无论您是否订阅它们。

您可以在代码后面动态地向窗体添加控件,但是如果您有一个单独的线程来完成工作,则需要使用Application Dispatcher CheckAccess和Invoke方法来确保控件在拥有它们的线程上加载