如何从OnLaunched访问App.xaml中定义的资源?

如何从OnLaunched访问App.xaml中定义的资源?,xaml,windows-8,windows-runtime,winrt-xaml,windows-8.1,Xaml,Windows 8,Windows Runtime,Winrt Xaml,Windows 8.1,我正在使用MVVM模式和MVVM灯。我在App.xaml中定义了一个ViewModelLocator,它保存使用Blend从视图绑定到的所有ViewModel 我有一个AppViewModel,它基本上包含了我应用程序的所有重要全局信息,比如用户偏好。AppViewModel由ViewModelLocator实例化,ViewModelLocator由app.xaml实例化 问题是,我需要从OnLaunched内部访问AppViewModel,然而,在应用程序生命周期的这个阶段,app.xaml似

我正在使用MVVM模式和MVVM灯。我在App.xaml中定义了一个ViewModelLocator,它保存使用Blend从视图绑定到的所有ViewModel

我有一个AppViewModel,它基本上包含了我应用程序的所有重要全局信息,比如用户偏好。AppViewModel由ViewModelLocator实例化,ViewModelLocator由app.xaml实例化

问题是,我需要从OnLaunched内部访问AppViewModel,然而,在应用程序生命周期的这个阶段,app.xaml似乎还没有实例化其声明的资源。它似乎只在Frame.Navigate()之后执行此操作

我需要访问AppViewModel,因为我必须检查其中的属性才能确定要加载的页面。因此,这是一个鸡和蛋的情况

如果我在OnLaunched中单独实例化AppViewModel,那么我可以访问AppViewModel,但是ViewModelLocator被实例化两次,这会导致IoC出现问题

是否有方法手动实例化app.xaml中声明的项?或者有没有办法让app.xaml在显示UI之前加载其资源

还是我做错了?一般来说,我认为应用程序是视图模型层,视图基本上观察到。。。因此,在呈现任何UI之前,我需要可用的ViewModels

XAML:

例外情况:

WinRT信息:找不到具有给定密钥的资源


谢谢

当您第一次需要时,如何实例化
ViewModelLocator
,然后将其添加到
应用程序中。Resources
一次
应用程序。Resources
以其他方式初始化,或者在您需要时初始化?您不需要总是在XAML中向
ResourceDictionaries
添加键值对。

因为应用程序需要可混合,这意味着它必须在XAML中声明。至少我认为需要在app.XAML中声明它才能在Blend中启用绑定!?不,它也可以在App.xaml.cs或任何你想要的地方定义。您只需要将其添加到
应用程序中。如果您希望以这种方式访问
ViewModelLocator,请参阅参考资料
。这样我就可以在Onlunched中向应用程序添加可混合的资源了?i、 例如,混合火只在设计时启动?你是对的,可能不是这样。您可能需要XAML中的
ViewModelLocator
。:)或者等待在
OnLaunched()方法中加载XAML资源。
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</Application.Resources>
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
    var vml = App.Current.Resources["Locator"] as ViewModelLocator; // exception raised