Podmíněný KÓD XAML

Podmíněný XAML umožňuje používat metodu ApiInformation.IsApiContractPresent přímo v kódu XAML. Vlastnosti můžete nastavit na základě přítomnosti kontraktu rozhraní API na úrovni operačního systému, aniž byste museli psát kód. Podmíněné příkazy se vyhodnocují za běhu – prvky označené podmíněnou značkou XAML se zpracují, pokud se vyhodnotí jako true, jinak jsou ignorovány.

Podmíněný XAML vyžaduje Windows 10 verze 1809 (build 17763) nebo novější, což je minimální verze operačního systému pro aplikace Windows App SDK.

Předpoklady

Important

Podmíněný XAML používá ApiInformation metody, které kontrolují přítomnost kontraktů a typů rozhraní API prostředí Windows Runtime (Windows.*) poskytovaných operačním systémem. Tyto kontroly se nevztahují na ovládací prvky WinUI 3 (Microsoft.UI.Xaml.*), protože WinUI 3 se dodává s vaší aplikací prostřednictvím Windows App SDK místo operačního systému – každý ovládací prvek WinUI 3, na kterém je vaše aplikace vytvořená, je vždy přítomna za běhu bez ohledu na to, který Windows 10/11 sestavení zařízení běží. #ifDirektivy preprocesoru nepomáhají ani tady: vyhodnocují se v době kompilace na základě cílové architektury, ne za běhu na základě operačního systému nebo Windows App SDK verze, která je skutečně nainstalována. Chcete-li podmínit použití funkce verzí sady Windows App SDK, kterou vaše aplikace používá, ověřte verzi sady SDK při sestavení nebo použijte blok try/catch při volání rozhraní API. Podrobnosti najdete v adaptivním kódu verze .

Základní informace o ApiInformation a kontraktech rozhraní API najdete v tématu Aplikace adaptivní na verze.

Podmíněné obory názvů

Pokud chcete v XAML použít podmíněnou metodu, deklarujte podmíněný obor názvů XAML v horní části stránky:

xmlns:myNamespace="schema?conditionalMethod(parameter)"

Obsah před oddělovačem ? je obor názvů nebo schéma. Obsah za ? je podmínka, která určuje, zda se obor názvů vyhodnotí jako true nebo false.

Ve většině případů schéma XML představuje výchozí obor názvů XAML:

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

Podmíněný xaml podporuje tyto podmíněné metody:

Metoda Inverzní
IsApiContractPresent(ContractName, VersionNumber) IsApiContractNotPresent(ContractName, VersionNumber)
IsTypePresent(ControlType) IsTypeNotPresent(ControlType)
IsPropertyPresent(ControlType, PropertyName) IsPropertyNotPresent(ControlType, PropertyName)

Note

Používejte IsApiContractPresent a IsApiContractNotPresent pro zajištění co nejlepšího prostředí v době návrhu. Ostatní podmíněné podmínky nejsou plně podporované v prostředí návrhu Visual Studio.

Nastavení vlastnosti podmíněně

Tento příklad zobrazuje text v TextBlock jen tehdy, když aplikace běží v systému Windows 10 verze 1903 (aktualizace z května 2019, build 18362) nebo novějším — ověření kontraktu, které je smysluplné, protože je novější než minimální verze 1809 sady Windows App SDK.

Nejprve definujte podmíněný obor názvů:

xmlns:contract8Present="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsApiContractPresent(Windows.Foundation.UniversalApiContract,8)"

Pak předponu vlastnosti pomocí podmíněného oboru názvů:

<TextBlock contract8Present:Text="Hello, Conditional XAML"/>

Zde je úplné značkování:

<Page
    x:Class="ConditionalTest.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:contract8Present="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsApiContractPresent(Windows.Foundation.UniversalApiContract,8)">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock contract8Present:Text="Hello, Conditional XAML"/>
    </Grid>
</Page>

Ekvivalentní kontrola v code-behind:

TextBlock textBlock = new TextBlock();

if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 8))
{
    textBlock.Text = "Hello, Conditional XAML";
}

Note

I když IsApiContractPresent přijímá řetězec jako parametr názvu kontraktu, v deklaraci oboru názvů XAML ho neuvádíte v uvozovkách.

Vzhledem k tomu, že minimální podporovaná verze operačního systému pro Windows App SDK je 1809 (UniversalApiContract verze 7), kontrola, zda je verze kontraktu rovna 7 nebo nižší, se v aplikaci Windows App SDK vždy vyhodnotí na true a neposkytuje žádné užitečné informace. Zkontrolujte pouze verze kontraktů vyšší než 7.

Použít podmínky if/else

Pokud chcete nastavit různé hodnoty v závislosti na kontraktu rozhraní API, definujte kladné i záporné podmíněné obory názvů:

xmlns:contract8NotPresent="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsApiContractNotPresent(Windows.Foundation.UniversalApiContract,8)"
xmlns:contract8Present="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsApiContractPresent(Windows.Foundation.UniversalApiContract,8)"

Potom vlastnost nastavte dvakrát, z nichž každá má jinou podmíněnou předponu. Za běhu se použije pouze jeden:

<TextBlock contract8NotPresent:Text="Hello, World"
           contract8Present:Text="Hello, May 2019 Update or later"/>

Vytvářejte instance ovládacích prvků podmíněně

Note

Podmíněné vytvoření instance elementu založeného na kontraktu rozhraní API operačního systému – na rozdíl od podmíněného nastavení vlastnosti – je vzor specifický pro UPW. Nevztahuje se na ovládací prvky WinUI 3.

V UPW tento model umožňuje vrátit se ke staršímu Windows.UI.Xaml.Controls ovládacímu prvku, když novější ovládací prvek nebyl v operačním systému dostupný. V aplikaci Windows App SDK se ovládací prvkyMicrosoft.UI.Xaml.Controls.* WinUI 3 dodávají s vaší aplikací prostřednictvím Windows App SDK, ne s operačním systémem. Každý ovládací prvek, na který je vaše aplikace sestavená ( včetně ColorPicker ), je zaručeno, že je k dispozici za běhu, takže před vytvořením instance neexistuje žádná verze operačního systému ke kontrole.

Pokud potřebujete podmínit použití ovládacího prvku WinUI 3 nebo rozhraní API verzí Windows App SDK, na kterou vaše aplikace cílí, proveďte tuto kontrolu při sestavení (nastavením minimální verze balíčku Windows App SDK) nebo obalte volání za běhu do try/catch — nikoli pomocí podmíněného XAML.