UWP应用程序中的合并资源字典初始化
本文关键字:资源 字典 初始化 合并 应用程序 UWP | 更新日期: 2023-09-27 18:27:19
在我的UWP应用程序的开发过程中,我注意到了一些有趣的奇怪之处,我很难解释。
我的用户MvvmLight和我决定将ViewModelLocator资源实例添加到一个单独的ResourceDictionary中,该ResourceDictionaryCore.xaml将从App.xam中的MergedDictionaries
引用。以下是应用程序.xam的内容:
<Application ...>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources/Core.xaml" />
<ResourceDictionary Source="Resources/Converters.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
Core.xaml:的内容
<ResourceDictionary ...>
<viewModel:ViewModelLocator x:Key="Locator" />
</ResourceDictionary>
现在,我假设Core.xaml中的资源在App.xaml.cs的InitializeComponent
方法调用期间初始化,但当我尝试使用ServiceLocator
类(它在MvvmLight中的ViewModelLocator的构造函数中设置)时-像这样-ServiceLocator.Current.GetInstance<INavigationService>().Navigate<MainViewModel>();
-我得到一个异常,说:
An exception of type 'System.InvalidOperationException' occurred in
Microsoft.Practices.ServiceLocation.dll but was not handled in user code
Additional information: ServiceLocationProvider must be set.
事实上,如果我在ViewModelLocator的构造函数中放置了一个断点,那么在激活Window之前不会调用它。更有趣的是,如果我手动引用Locator资源键(例如,将Debug.WriteLine(Resources["Locator"]);
置于ServiceLocator
的调用之上),一切都会正常工作。如果我将ViewModelLocator
资源直接移动到App.xaml,情况也是如此,那么它将在IntializeComponent
期间实例化。
UWP应用程序中是否存在合并资源字典的懒惰实例化?或者为什么它会这样?
UWP中的ResourceDictionary
没有任何代码隐藏(没有InitializeComponent
)。因此,ResourceDictionary
中定义的任何类引用都不会直接初始化。
App.InitializeComponent
也不会为您做这件事。UWP中的资源字典没有提供这种功能——不要问我为什么。
您可以通过尝试在ResourceDictionary
中初始化DataTemplate
来轻松尝试此操作
可悲的是,这不应该奏效。
但是,在代码隐藏中使用Resources["Locator"]
访问会触发类的构造函数,您就可以了。
这不是一个解决方案,而是对你的问题的解释。我希望它能帮助你。