如何解决通过UWP中的可选包显示页面
我想向我的UWP应用添加一些功能。可选软件包似乎是一种解决方法。 因此,我将ViewModel类和Page类移至可选包,并将它们放入可选包的名称空间中。 安装可选软件包后,我想显示已移动的页面,但是总是出现以下错误:
Windows.UI.Xaml.Markup.XamlParseException
HResult=0x802B000A
Message=XAML parsing failed.
Source=System.Private.Interop
StackTrace:
at System.Runtime.InteropServices.McgMarshal.ThrowOnExternalCallFailed(Int32 hr,RuntimeTypeHandle typeHnd) in f:\dd\ndp\fxcore\CoreRT\src\System.Private.Interop\src\Shared\McgMarshal.cs:line 1189
at __Interop.ComCallHelpers.Call(__ComObject __this,RuntimeTypeHandle __typeHnd,Int32 __targetIndex,Void* arg0,Void* arg1,Int32 arg2)
at Windows.UI.Xaml.IApplicationStatics__Impl.Stubs.LoadComponent(__ComObject __this,Object component,Uri resourceLocator,ComponentResourceLocation componentResourceLocation)
at Windows.UI.Xaml.Application.__Factory_Windows_UI_Xaml__IApplicationStatics_LoadComponent(String typeName,ComponentResourceLocation componentResourceLocation)
at Windows.UI.Xaml.Application.LoadComponent(Object component,ComponentResourceLocation componentResourceLocation)
at <my classes>
如何加载和显示可选软件包的页面?
解决方法
我检查了您的项目,您在MainApp
项目中添加了可选软件包项目参考,这不是建议的可选软件包开发方法。
可选包是附加的,就像游戏的DLC一样,它不会影响主应用程序,也不是主应用程序项目的必要参考。
这意味着MainApp
项目和可选软件包项目需要单独安装。实际上,您不能在一个UWP应用程序项目中引用另一个UWP应用程序项目,因为它们的入口点存在冲突。
因此,请按照以下步骤操作:
- 在
MainApp
项目中删除对可选软件包项目的引用。 - 将
App.xaml
和MainPage.xaml
文件还原到可选软件包项目中。 (您可以创建一个新的UWP应用程序项目,这可能会更容易) - 如this blog所述,修改可选软件包项目中
Package.appxmanifest
的内容,删除 Capability 标记,并添加对 MainPackageDependency 的引用 strong>。
从这些步骤中,您可以发现不再可以在MainApp项目中直接引用HalloPage类。同时,即使安装了可选软件包,也无法通过反射获得页面类型。
因此将页面放在可选包中可能不是合适的解决方案。
,我终于发现,生成的InitializeComponent()
方法是错误的。
在我的sample code repository的fixed
分支中,一个可行的解决方案。
在可选包的Pages背后的代码中,必须用以下代码替换InitializeComponent()
的构造函数调用:
Uri resourceLocator = new Uri("ms-appx://ad4d8e16-9f9c-458f-ac0f-e74cb99fa10c/HalloPage.xaml");
Application.LoadComponent(this,resourceLocator,ComponentResourceLocation.Nested);
ad4d8e16-9f9c-458f-ac0f-e74cb99fa10c
是可选软件包的标识名。如果要加载图像,资源字典等,则必须以相同格式编写URI,包括可选软件包的标识名。否则,您将从主应用程序加载资源。
如果工具链本身能够生成正确的URI,那就太好了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。