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.csInitializeComponent方法调用期间初始化,但当我尝试使用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应用程序中的合并资源字典初始化

UWP中的ResourceDictionary没有任何代码隐藏(没有InitializeComponent)。因此,ResourceDictionary中定义的任何类引用都不会直接初始化。

App.InitializeComponent也不会为您做这件事。UWP中的资源字典没有提供这种功能——不要问我为什么。

您可以通过尝试在ResourceDictionary中初始化DataTemplate来轻松尝试此操作
可悲的是,这不应该奏效。

但是,在代码隐藏中使用Resources["Locator"]访问会触发类的构造函数,您就可以了。

这不是一个解决方案,而是对你的问题的解释。我希望它能帮助你。