版本調適型程式碼

你可以把寫自適應程式碼當作建立自適應 UI 的思考方式。 設計基礎程式碼讓它能在最低作業系統版本上運行,當你偵測到應用程式在較高版本且有新功能可用時,再加入功能。

關於 、API 契約及 Visual Studio 配置的背景資訊ApiInformation,請參閱版本自適應應用程式

先決條件

執行時 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 檢查在啟動時執行一次,並儲存結果以便重複使用。
將最低版本維持在較低水準 將專案的最低版本設定到最低,以觸及最廣泛的受眾,並使用自適應程式碼在新作業系統版本中點亮功能
測試最低版本 請務必在最低支援的作業系統版本上測試,以驗證備援路徑是否正常運作