在UWP中显示可选包中的页面
我想向我的UWP应用程序添加一些功能。可选软件包似乎是实现这一点的一种方式。 因此,我将ViewModel类和Page类移动到可选包中,并将它们放入可选包的命名空间中。 安装可选软件包后,我想显示已移动的页面,但总是出现以下错误:在UWP中显示可选包中的页面,uwp,Uwp,我想向我的UWP应用程序添加一些功能。可选软件包似乎是实现这一点的一种方式。 因此,我将ViewModel类和Page类移动到可选包中,并将它们放入可选包的命名空间中。 安装可选软件包后,我想显示已移动的页面,但总是出现以下错误: Windows.UI.Xaml.Markup.XamlParseException HResult=0x802B000A Message=XAML parsing failed. Source=System.Private.Interop StackT
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, Object component, Uri resourceLocator, ComponentResourceLocation componentResourceLocation)
at Windows.UI.Xaml.Application.LoadComponent(Object component, Uri resourceLocator, ComponentResourceLocation componentResourceLocation)
at <my classes>
Windows.UI.Xaml.Markup.XamlParseException
HResult=0x802B000A
Message=XAML解析失败。
Source=System.Private.Interop
堆栈跟踪:
在f:\dd\ndp\fxcore\CoreRT\src\System.Private.Interop\src\Shared\mcgmawarl.cs:第1189行中的System.Runtime.InteropServices.mcgmaral.ThrowOnExternalCallFailed(Int32 hr,RuntimeTypeHandle typeHnd)中
在Interop.ComCallHelpers.Call(\uuuuuComObject\uuuuuuuThis,RuntimeTypeHandle\uuuuuuuuTypeHnd,Int32\uuuuuuTargetIndex,Void*arg0,Void*arg1,Int32 arg2)
在Windows.UI.Xaml.iaapplicationstatics\uuuu Impl.Stubs.LoadComponent(\uuuu ComObject\uuuu this,Object component,Uri resourceLocator,ComponentResourceLocation ComponentResourceLocation)
在Windows.UI.Xaml.Application.\u_工厂\uWindows\uUI\u_Xaml\u_IApplicationStatics\uLoadComponent(字符串类型名、对象组件、Uri资源定位器、组件资源位置组件资源位置)
位于Windows.UI.Xaml.Application.LoadComponent(对象组件、Uri resourceLocator、ComponentResourceLocation ComponentResourceLocation)
在
如何加载和显示可选软件包的页面?我检查了您的项目,您在
MainApp
项目中添加了可选软件包项目参考,这不是推荐的可选软件包开发方法
可选包是附加的,就像游戏的DLC一样,它不会影响主应用程序,也不是主应用程序项目的必要参考
这意味着需要分别安装MainApp
项目和可选软件包项目。事实上,您不能在一个UWP应用程序项目中引用另一个UWP应用程序项目,它们的入口点是冲突的
因此,请遵循以下步骤:
MainApp
项目中可选软件包项目的引用App.xaml
和MainPage.xaml
文件。(您可以创建一个新的UWP应用程序项目,这可能更容易)Package.appxmanifest
的内容,如中所述,删除Capability标记,并添加对MainPackageDependency的引用因此,将页面放在可选包中可能不是合适的解决方案。我最终发现,生成的
InitializeComponent()
方法是错误的
在my的中,fixed
分支是一个有效的解决方案
在可选包页面后面的代码中,构造函数调用的InitializeComponent()
必须替换为以下代码:
uriresourcelocator=新的Uri(“ms-appx://ad4d8e16-9f9c-458f-ac0f-e74cb99fa10c/HalloPage.xaml");
LoadComponent(这个,resourceLocator,ComponentResourceLocation.Nested);
ad4d8e16-9f9c-458f-ac0f-e74cb99fa10c
是可选包的标识名。如果要加载图像、资源字典等,则必须以相同的格式编写URI,包括可选包的标识名。否则,您将从主应用程序加载资源
如果工具链能够自己生成正确的URI,那就太好了。Hello,从错误消息中,问题可能来自您移动的页面的XAML部分。你能提供一个最低限度的复制样本,以便我们分析这个问题吗?嗨@RichardZhang MSFT,谢谢你的回答。我将用最少的项目创建一个解决方案,并在下面的评论中添加一个链接。@RichardZhang MSFT我在上创建了一个项目,感谢您检查我的项目。可选包的项目中从来没有App.xaml。我按照这些说明()进行操作,说明我必须引用可选包的.winmd文件来调用可选包的代码。我现在有点困惑。如果我只使用C代码构建页面,我可以创建该页面的对象并将其设置为框架内容(使用
NavigateTo
不起作用),但我无法使用XAML页面。抱歉,我遗漏了一些内容。在中,您需要引用的是winmd
文件,其中包含类型定义,这是您访问MainApp
中可选包中类型的基础。在Bundle.mapping.txt文件中,需要引用winmd文件而不是csproj文件。然而,在我的测试中,winmd文件导致了另一个加载错误。我会报告这个问题,如果有新的信息,我会发布到这里。我终于找到了从可选包加载xaml页面的方法。有没有办法让工具链为我做修复?您好,我很高兴您找到了解决方案。你可以标记你的答案,这样你就可以帮助更多有同样问题的人。关于此解决方法,这似乎是一个内部资源管理设置,您可以在Windows10反馈中心应用程序中询问此问题。