在UWP中显示可选包中的页面

在UWP中显示可选包中的页面,uwp,Uwp,我想向我的UWP应用程序添加一些功能。可选软件包似乎是实现这一点的一种方式。 因此,我将ViewModel类和Page类移动到可选包中,并将它们放入可选包的命名空间中。 安装可选软件包后,我想显示已移动的页面,但总是出现以下错误: Windows.UI.Xaml.Markup.XamlParseException HResult=0x802B000A Message=XAML parsing failed. Source=System.Private.Interop StackT

我想向我的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, 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的引用
  • 从这些步骤中,您可以发现在MainApp项目中不再可以直接引用HalloPage类。同时,即使安装了可选包,也无法通过反射获取页面类型


    因此,将页面放在可选包中可能不是合适的解决方案。

    我最终发现,生成的
    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反馈中心应用程序中询问此问题。