在UWP app中合并ResourceDictionary初始化

时间:2015-12-17 11:43:15

标签: c# xaml uwp resourcedictionary

在开发我的UWP应用程序的过程中,我注意到了一些奇怪的问题,我很难解释。

我是用户MvvmLight,我决定将ViewModelLocator资源实例添加到单独的ResourceDictionary Core.xaml 中,该实例将从 App.xaml 中的MergedDictionaries引用。 以下是 App.xaml 的内容:

<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应用程序中是否存在合并资源字典的惰性实例化?或者它为什么会这样?

1 个答案:

答案 0 :(得分:6)

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

App.InitializeComponent也没有为你做这件事。 UWP中的资源词典只是没有提供这个功能 - 不要问我为什么。

您可以尝试初始化DataTemplate中的ResourceDictionary来轻松尝试此操作 这应该 - 可悲的是 - 都不行。

但是,在后面的代码中使用Resources["Locator"]访问会触发类的构造函数,并且你很好。

这不是解决方案,而是对您的问题的解释。 我希望它可以帮助你。