【问题标题】:Merged ResourceDictionary initalization in UWP appUWP 应用程序中的合并 ResourceDictionary 初始化
【发布时间】:2015-12-17 11:43:14
【问题描述】:

在开发我的 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 方法调用期间被初始化,但是当我尝试使用 @ 987654326@ 类(在 MvvmLight 中 ViewModelLocator 的构造函数中设置) - 像这样 - ServiceLocator.Current.GetInstance&lt;INavigationService&gt;().Navigate&lt;MainViewModel&gt;(); - 我得到一个异常说:

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

【问题讨论】:

  • 我注意到当您的 ResourceDictionary 中有多个普通(非样式)对象时会发生这种奇怪的行为。只有一个 ViewModelLocator 完全有效,并且正在调用 ctor。我的发现stackoverflow.com/questions/34466035/…

标签: c# xaml uwp resourcedictionary


【解决方案1】:

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

App.InitializeComponent 也不会为您执行此操作。 UWP 中的资源字典不提供此功能 - 不要问我为什么。

您可以通过尝试在 ResourceDictionary 中初始化 DataTemplate 来轻松尝试此操作。
这应该 - 遗憾的是 - 都不起作用。

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

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

【讨论】:

  • 感谢您的解释!解决此问题的一种方法是为字典添加一个代码隐藏类,就像使用包含 {x:Bind} 的字典一样,对吧?但我想最好手动实例化 ViewModelLocator,因为这是直接需要的唯一资源,因此它可以节省加载时间的内存。
  • @MZetko 如果它非常重要,您可以在 App.xaml Resources 部分初始化它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2016-04-26
相关资源
最近更新 更多