ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 在UWP应用程序中合并ResourceDictionary初始化

2019-05-16 20:57:13  阅读:282  来源: 互联网

标签: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>

现在我假设在App.xaml.cs中的InitializeComponent方法调用期间初始化了Core.xaml中的资源,但是当我尝试使用ServiceLocator类(在MvvmLight的ViewModelLocator的构造函数中设置)时 – 就像这样 – ServiceLocator. Current.GetInstance&LT INavigationService&GT()&导航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应用程序中是否存在合并资源字典的惰性实例化?或者它为什么会这样?

解决方法:

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

App.InitializeComponent也没有为您执行此操作. UWP中的资源词典只是不提供这种功能 – 不要问我原因.

您可以通过尝试在ResourceDictionary中初始化DataTemplate来轻松尝试此操作.
这应该 – 可悲的是 – 都不行.

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

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

标签:c,xaml,uwp,resourcedictionary
来源: https://codeday.me/bug/20190516/1116377.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有