Frame.Navigate 到不同程序集中的页面派生 class

Frame.Navigate to a Page-derived class in a different assembly

我想将我的 Windows Phone 8 Blank App template based view 保留在与包含应用程序清单和 App.xaml.[=23= 的程序集不同的程序集中]

我一直收到一个神秘的异常,它对解决问题毫无帮助:

  1. 从模板 Visual C# 创建一个新项目 > Store Apps > Windows Phone Apps > Blank App (Windows Phone).
  2. 构建和部署,效果很好。 MainPage.xaml 的属性表明生成操作是页面,这是正确的。
  3. 根据包含原始项目的解决方案中相同类别的 Class 库 (Windows Phone) 模板创建一个新项目,将其命名为 MyApp.Views.
  4. 使用剪切和粘贴命令将 MainView.xaml 文件移动到新创建的项目中。
  5. 在原始项目中添加对MyApp.Views的引用。
  6. 构建、部署、查看应用程序启动并无法定位视图,仅将此异常传播回开发人员的盒子:ComException错误 HRESULT E_FAIL 已从对 COM 组件的调用返回。 这并没有说任何有用的东西,顶部堆栈框架是 Windows.UI.Xaml.Controls.Frame.Navigate(Type sourcePageType, Object parameter) 在第一个框架之后,即 TheOriginalProject.App.OnLaunched(LaunchActivatedEventArgs e)

解决方案是不要将 NavigationService 与 pack URI 一起使用,因为它似乎在 Windows Phone 8 中不存在,或者至少包含它的程序集未被引用空白应用程序模板中的默认值。无论如何,与包 URI 相比,我更喜欢强类型的视图名称。

我想肯定有人已经 运行 解决了这个问题,问题是什么?是否有 API 或工具可以让我深入了解来自 COM 的最新 E_FAIL 是什么?

编辑:当使用Window.Current.Content = new MainPage()作为OnLaunched的唯一内容时,弹出XAML解析器异常。它无法填充异常消息,但肯定会更好地提示正在发生的事情。不过仍然没有解决方案,问题只转移到 MainPage 构造函数中的 this.InitializeComponent()

我现在看到的是 Windows.UI.Xaml.Markup.XamlParseException 分析器内部错误的 WinRT 信息:对象编写器“%0” 和附加信息无法加载。 x:Class 属性出现在异常对话框提示的位置 128 window 和 this thread 似乎相关,但我不知道如何。

请注意,我还会在确认没有收到我收到的错误的人身上找到价值。如果您已尝试重现问题的步骤但未能重现问题,请发表评论,以便我确定是什么导致了我正在努力解决的错误。

将视图外部化到单独项目同时避免此问题的替代解决方案是使用 共享项目 项目类型,将视图放在那里并从主项目引用它。

这不会为视图生成单独的程序集,相反,文件只是在它们的自定义项目中分组,但在编译期间表现得好像它们是主项目的一部分。错误消失了,因为从编译器的角度来看,共享项目中的文件与直接在主项目中的文件没有区别。在运行时,视图的类型不需要从不同的程序集中解析,它就在同一个程序集中。