你可以把寫自適應程式碼當作建立自適應 UI 的思考方式。 設計基礎程式碼讓它能在最低作業系統版本上運行,當你偵測到應用程式在較高版本且有新功能可用時,再加入功能。
關於 、API 契約及 Visual Studio 配置的背景資訊ApiInformation,請參閱版本自適應應用程式。
先決條件
- 一個 Windows 應用程式 SDK 專案(打包或非打包)。 請參考 快速入門:建立你的第一個 WinUI 3 應用程式。
- 熟悉 Windows 執行階段(WinRT)型別系統,因為
ApiInformation檢查只適用於Windows.*命名空間型別。
執行時 API 檢查
在程式碼的條件式中使用 Windows.Foundation.Metadata.ApiInformation 類別,以檢查您想呼叫的 API 是否存在。 這個條件會在應用程式執行的任何位置進行評估,但只有在 API 存在且可供呼叫的裝置上,才會評估為 true。
Important
ApiInformation檢查僅適用於命名空間中的 Windows.* 類型。 他們不會偵測 WinUI 類型(Microsoft.UI.Xaml.*),因為這些類型屬於 Windows 應用程式 SDK 框架套件,而非作業系統,且不會註冊為可ApiInformation查詢的 WinRT 元資料。
#if 預處理器指令在這裡也沒什麼幫助——它們是在編譯時根據目標框架評估,而不是執行時根據應用程式實際執行的作業系統或 SDK 版本。 要有條件地啟用 WinUI 功能,請檢查你的應用程式所依據的 Windows 應用程式 SDK 版本(參見版本自適應應用程式),或將呼叫包裝成 try/catch,執行時失敗時再退回。
Tip
許多執行時的 API 檢查都會影響應用程式的效能。 先檢查一次,然後快取結果,然後在整個應用程式中使用快取結果。
自適應程式碼選項
建立自適應程式碼有兩種方式:
- 應用程式程式碼 — 在後置程式碼中使用執行階段 API 檢查。 這是大多數情況下的建議做法。
- 狀態觸發器 — 使用可擴充的狀態觸發器,根據 API 的存在啟動視覺狀態。 當你遇到在不同作業系統版本之間、與視覺狀態相關聯的簡單屬性或列舉值變更時,可以使用狀態觸發條件。
範例:檢查列舉值
這個範例說明如何在使用前檢查特定的列舉值是否存在。 若該值不存在,程式碼會退回到替代方案。
EnergySaverStatus以及 PowerManager 都是命名空間中的Windows.System.Power真正 Windows 執行階段 型別,因此ApiInformation可以正確查詢它們。
if (ApiInformation.IsEnumNamedValuePresent(
"Windows.System.Power.EnergySaverStatus", "On"))
{
if (PowerManager.EnergySaverStatus == EnergySaverStatus.On)
{
// Reduce background work to save battery.
ReduceBackgroundActivity();
}
}
else
{
// Energy Saver status isn't available on this OS version; skip the check.
}
void ReduceBackgroundActivity()
{
// Pause non-essential timers, syncs, and animations here.
}
Important
當你快取 API 檢查結果時,請在整個應用程式中一致使用這個快取值。 不要在多個地方重複檢查——只檢查一次,儲存結果,並在各處查閱。
範例:檢查是否有此方法
在呼叫前,請用以 IsMethodPresent 確認特定方法是否可用:
DisplayRequest displayRequest = new DisplayRequest();
if (ApiInformation.IsMethodPresent(
"Windows.System.Display.DisplayRequest", "RequestActive"))
{
displayRequest.RequestActive();
}
範例:檢查某個房產
在閱讀前,請用 IsPropertyPresent 以確認某個特定物件是否存在:
if (ApiInformation.IsPropertyPresent(
"Windows.System.Power.PowerManager", "RemainingChargePercent"))
{
int chargePercent = PowerManager.RemainingChargePercent;
}
最佳做法
| 練習 | 指導 |
|---|---|
| 使用靜態弦 | 使用 ApiInformation 檢查 API 名稱時,請使用硬編碼字串,而非 .NET 反射,以避免執行階段的型別載入問題 |
| 快取結果 | 每次 API 檢查在啟動時執行一次,並儲存結果以便重複使用。 |
| 將最低版本維持在較低水準 | 將專案的最低版本設定到最低,以觸及最廣泛的受眾,並使用自適應程式碼在新作業系統版本中點亮功能 |
| 測試最低版本 | 請務必在最低支援的作業系統版本上測試,以驗證備援路徑是否正常運作 |