將 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 <版本>,其未安裝或作為 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) 應用程式。 找到正確的對等資源並更新您的標記。 您馬上會遇到的例子可能是系統 TextBlock 樣式鍵,例如 PhoneTextNormalStyle
C# 編譯器提出錯誤「找不到類型或命名空間名稱『<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 <版本>,其未安裝或作為 Visual Studio 未來更新的一部分」時該怎麼做? 請參閱本主題中的 TargetPlatformVersion 一節。
在 xaml.cs 檔案中呼叫 InitializeComponent 時,會引發 System.InvalidCastException。 當您有多個 xaml 檔案 (至少其中一個符合 MRT 資格) 共用同一個 xaml.cs 檔案,且兩個 xaml 檔案之間的元素具有不一致的 x:Name 屬性時,就會發生這種情況。 嘗試對兩個 xaml 檔案中的相同元素新增相同的名稱,或完全省略那些名稱。

下一個主題是移植 XAML 和 UI