排查将 Silverlight 移植到 UWP Windows Phone问题

上一主题是 移植项目

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

跟踪问题

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

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

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

TargetPlatformVersion

本部分介绍如何在 Visual Studio 中打开 Windows 10 项目时看到消息“需要 Visual Studio 更新”。 一个或多个项目需要未安装或包含在 Visual Studio 的未来更新过程中的平台 SDK <版本> 。

  • 首先,确定已安装的适用于 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>’属性。”。 移植某些类型名称(例如根 )后,这些错误将开始显示。 成员或属性不适用于 UWP,因此找到等效项并更新标记。 你可能立即遇到的示例是 SupportedOrientationsOrientation
XAML 分析程序或编译器提供错误“未找到可附加属性 [...] [...]。”或“未知可附加成员 [...]。” 这可能是由类型而不是附加属性引起的;在这种情况下,你已收到该类型的错误,修复后,此错误将消失。 你可能立即遇到的示例是 phone:PhoneApplicationPage.Resourcesphone:PhoneApplicationPage.DataContext
XAML 分析程序或编译器或运行时异常提供错误“无法解析资源”<resourcekey>”。 资源密钥不适用于通用 Windows 平台(UWP)应用。 找到正确的等效资源并更新标记。 你可能立即遇到的示例是系统 TextBlock 样式键,例如 PhoneTextNormalStyle
C# 编译器提供错误“找不到类型或命名空间名称'name>'<”或“命名空间名称'<name>'不存在于命名空间中 ”“或”类型或命名空间名称 '<name>' 不存在于当前上下文中”。 这可能意味着编译器尚不知道类型的正确 UWP 命名空间。 使用 Visual Studio 的 Resolve 命令修复此问题。
如果 API 不在称为通用设备系列的 API 集中(换句话说,API 在扩展 SDK 中实现),请使用 扩展 SDK。
在其他情况下,端口可能不太简单。 你可能立即遇到的示例是 DesignerPropertiesBitmapImage
当在设备上运行的应用终止,或从 Visual Studio 中启动时,你将看到错误“无法激活 Windows 运行时 8.x 应用 […]。 激活请求失败,出现错误“Windows 无法与目标应用程序通信。 这通常表示目标应用程序的进程已中止。 […]”. 问题可能是初始化期间在自己的 Pages 或绑定属性(或其他类型)中运行的命令性代码。 或者,在分析即将在应用终止时显示的 XAML 文件(如果从 Visual Studio 启动,这将是启动页面)时可能发生此情况。 查找无效的资源密钥,并/或尝试本主题中“ 跟踪问题 ”部分中的一些指南。
XamlCompiler 错误 WMC0055:无法将文本值“<your stream geometry>”分配到类型“RectangleGeometry”的属性“Clip”中 在 UWP 中,Microsoft DirectX 和 XAML C++ UWP 应用的类型
XamlCompiler 错误WMC0001:XML 命名空间中的未知类型“RadialGradientBrush” ~ UWP 没有 RadialGradientBrush 类型。 从标记中删除 RadialGradientBrush,并使用一些其他类型的 Microsoft DirectX 和 XAML C++ UWP 应用。
XamlCompiler 错误 WMC0011:元素“<UIElement type>”上的成员“OpacityMask”未知 UWP Microsoft DirectX 和 XAML C++ UWP 应用。
SYSTEM 中出现类型为“System.Runtime.InteropServices.COMException”的第一个机会异常。NI.DLL。 附加信息: 应用程序调用了为另一个线程封送的界面。 (HRESULT 例外:0x8001010E(RPC_E_WRONG_THREAD))。 你正在执行的操作需要在 UI 线程上完成。 调用 CoreWindow.GetForCurrentThread
动画正在运行,但它对其目标属性没有影响。 使动画独立,或对其进行设置 EnableDependentAnimation="True" 。 请参阅动画
在 Visual Studio 中打开 Windows 10 项目时,会看到消息“需要 Visual Studio 更新。 一个或多个项目需要未安装或包含在 Visual Studio 的未来更新过程中的平台 SDK <版本> 。 请参阅本主题中的 TargetPlatformVersion 部分。
在xaml.cs文件中调用 InitializeComponent 时,将引发 System.InvalidCastException。 如果有多个 xaml 文件(至少其中一个是 MRT 限定)共享同一个xaml.cs文件和元素具有两个 xaml 文件之间不一致的 x:Name 属性,则可能会发生这种情况。 尝试将相同的名称添加到两个 xaml 文件中的相同元素,或完全省略名称。

下一主题是 移植 XAML 和 UI