将 Windows Phone Silverlight 移植到 UWP 疑难解答

上一主题是移植项目

我们强烈建议阅读到此移植指南的末尾,但是我们也理解你希望尽快前进到项目生成和运行的阶段。 阅读到该末尾后,你可以注释或排除非必要的代码,然后稍后返回支付该债务,从而临时加快进度。 本主题中的疑难解答症状和补救办法的表格可能在此阶段对你有用,尽管它无法替代阅读接下来的一些主题。 在你执行到以后的主题时,你可以一直重新参考该表。

跟踪问题

XAML 分析异常可能难以诊断出来,特别是在此类异常中没有含义明确的错误消息时。 请确保已将调试程序配置为捕获第一轮异常(以便试图捕获早期的分析异常)。 你可以检查调试程序中的异常变量,以确定 HRESULT 或消息中是否具有任何有用的信息。 也可以检查 Visual Studio 的输出窗口,以获取由 XAML 分析器输出的错误消息。

如果你的应用终止,并且你只知道在 XAML 标记分析期间引发了未处理的异常,那么这可能是引用缺失资源(即,Windows Phone Silverlight 应用中存在其键但在 Windows 10 应用中不存在的资源,例如某些系统 TextBlock 样式键)的结果。 或者,它可以是在 UserControl、自定义控件或自定义布局面板内部引发的异常。

最后一项措施是进行二进制拆分。 从页面中删除大约一半标记并重新运行应用。 然后,你将知道错误是在已删除的那一半中(你现在应该在任何情况下恢复)还是在删除的那一半中。 通过拆分包含错误的那一半来重复此过程,依此类推,直到完全解决了问题。

TargetPlatformVersion

本部分介绍了在 Visual Studio 中打开 Windows 10 项目后看到如下消息时该执行何种操作:“需要 Visual Studio 更新。 一个或多个项目需要平台 SDK <version>(未安装该 SDK 版本,也未将其作为 Visual Studio 后续更新的一部分进行提供)。”

  • 首先,确定适用于你已安装的 Windows 10 的 SDK 版本号。 导航到 C:\Program Files (x86) \Windows Kits\10\Include\<versionfoldername> ,并记 <下 versionfoldername>,这将以四边形表示法“Major.Minor.Build.Revision”表示。
  • 打开项目文件以进行编辑,并找到 TargetPlatformVersionTargetPlatformMinVersion 元素。 将它们编辑为如下外观,使用你在磁盘上找到的四部分表示法版本号替换 <versionfoldername>
   <TargetPlatformVersion><versionfoldername></TargetPlatformVersion>
   <TargetPlatformMinVersion><versionfoldername></TargetPlatformMinVersion>

症状和补救方法疑难解答

表格中的补救方法信息旨在为你提供足够自行取消阻止的充足信息。 阅读以后的主题时,你将发现有关其中每个问题的进一步详细信息。

症状 纠正方法
XAML 分析程序或编译器提供错误“名称‘<typename>’在命名空间 […] 中不存在。 如果 <typename> 是自定义类型,那么在 XAML 标记中的命名空间前缀声明中,将“clr-namespace”更改为“using”,并删除任何程序集令牌。 对于平台类型,这意味着该类型不适用于通用 Windows 平台 (UWP),因此请查找等效项并更新标记。 你可能立即遇到的示例是 phone:PhoneApplicationPageshell:SystemTray.IsVisible
XAML 分析程序或编译器提供错误“成员'<membername>'未被识别或不可访问”。或“属性'<propertyname>'在类型 [...].”中找不到。 这些错误将在你移植某些类型名称后开始显示,例如根 Page。 成员或属性不适用于 UWP,因此请查找等效项并更新标记。 你可能立即遇到的示例是 SupportedOrientationsOrientation
XAML 分析程序或编译器提供错误“未找到可附加属性 [...] [...]。”或“未知可附加成员 [...]。”。 这可能是由类型(而不是附加的属性)导致的;在这种情况下,你将已经具有该类型的错误,并且此错误将在你修复该错误后消失。 你可能立即遇到的示例是 phone:PhoneApplicationPage.Resourcesphone:PhoneApplicationPage.DataContext
XAML 分析程序或编译器或者运行时异常会提供错误“无法解析资源‘<resourcekey>’。”。 该资源键不适用于通用 Windows 平台 (UWP) 应用。 找到对应的等效资源并更新你的标记。 例如,你可能立即遇到诸如 PhoneTextNormalStyleTextBlock 样式键。
C# 编译器提供错误“找不到类型或命名空间名称'name>'<”。或“类型或命名空间名称'name'name<>'不存在于命名空间 [...]”或“类型或命名空间名称'name'name<>'不存在于当前上下文中”。 这可能意味着编译器尚不知道某个类型的正确 UWP 命名空间。 使用 Visual Studio 的 Resolve 命令解决该问题。
如果该 API 不在称为通用设备系列的 API 集中(换句话说,该 API 在扩展 SDK 中实现),则使用扩展 SDK
可能存在端口较复杂的其他情况。 你可能立即遇到的示例是 DesignerPropertiesBitmapImage
当在设备上运行的应用终止,或从 Visual Studio 中启动时,你将看到错误“无法激活 Windows 运行时 8.x 应用 […]。 激活请求失败并显示错误“Windows 无法与目标应用程序通信。 这通常指示目标应用的过程已中止。 […]”. 问题可能是在初始化过程中,在你自己的页面或绑定属性(或其他类型)中运行的强制性代码。 或者,它可能在分析将要在应用终止时显示的 XAML 文件时发生(如果从 Visual Studio 中启动,则将是启动页)。 查找无效的资源键并/或尝试使用本主题的跟踪问题部分中的一些指南。
XamlCompiler 错误 WMC0055:无法将文本值“<流几何图形>”分配给类型为“RectangleGeometry”的属性“Clip” 在 UWP 中,Microsoft DirectX 的类型和 XAML C++ UWP 应用。
XamlCompiler 错误 WMC0001:XML 命名空间中的“RadialGradientBrush”类型未知 [...] UWP 不具有 RadialGradientBrush 类型。 从标记中删除 RadialGradientBrush 并使用一些其他类型的 Microsoft DirectX 和 XAML C++ UWP 应用。
XamlCompiler 错误 WMC0011:元素“UIElement 类型>”上的未知成员“<OpacityMask” UWP Microsoft DirectX 和 XAML C++ UWP 应用。
SYSTEM.NI.DLL 中发生的类型“System.Runtime.InteropServices.COMException”的第一轮异常。 附加信息: 应用程序调用了为另一个线程封送的界面。 (来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))。 必须在 UI 线程上完成你正在执行的工作。 调用 CoreWindow.GetForCurrentThread)。
动画正在运行,但是它对其目标属性没有影响。 使动画独立,或对其设置 EnableDependentAnimation="True"。 请参阅动画
在 Visual Studio 中打开 Windows 10 项目时,你会看到如下消息:“需要 Visual Studio 更新。 一个或多个项目需要平台 SDK <version>(未安装该 SDK 版本,也未将其作为 Visual Studio 后续更新的一部分进行提供)。” 请参阅本主题中的 TargetPlatformVersion 部分。
当在 xaml.cs 文件中调用 InitializeComponent 时,将引发 System.InvalidCastException。 当你有多个 xaml 文件(至少其中一个受 MRT 限定)共享同一个 xaml.cs 文件并且元素具有在两个 xaml 文件之间不一致的 x:Name 属性时,可能会发生这种情况。 尝试将相同名称添加到两个 xaml 文件中的相同元素,或全部省略名称。

下一主题是移植 XAML 和 UI