Feltételes XAML

A feltételes XAML lehetővé teszi az ApiInformation.IsApiContractPresent metódus közvetlen használatát az XAML-korrektúrában. A tulajdonságokat egy operációsrendszer-szintű API-szerződés jelenléte alapján állíthatja be anélkül, hogy kódokat ír le. A feltételes utasítások futásidőben értékelődnek ki – a feltételes XAML-címkével ellátott elemeket a rendszer feldolgozza, ha true értékre értékelődnek ki, ellenkező esetben pedig figyelmen kívül hagyja őket.

A feltételes XAML-hez Windows 10 1809-es (17763-as build) vagy újabb verzió szükséges, amely Windows App SDK alkalmazások minimális operációsrendszer-verziója.

Prerequisites

Important

A feltételes XAML metódusokat használApiInformation, amelyek ellenőrzik az operációs rendszer által biztosított Windows-futtatókörnyezet (Windows.*) API-szerződések és -típusok meglétét. Ezek az ellenőrzések nem vonatkoznak a WinUI 3 (Microsoft.UI.Xaml.*) vezérlőkre, mivel a WinUI 3 nem az operációs rendszerrel, hanem az Windows App SDK szállítja az alkalmazást – az alkalmazás minden WinUI 3 vezérlője futásidőben mindig jelen van, függetlenül attól, hogy melyik Windows 10/11 builden fut az eszköz. #ifaz előprocesszor-irányelvek itt sem segítenek: fordításkor lesznek kiértékelve a cél keretrendszer alapján, nem futtatókörnyezetben az operációs rendszer vagy a ténylegesen telepített Windows App SDK verzió alapján. Ha egy funkció elérhetőségét attól szeretné függővé tenni, hogy az alkalmazás a Windows App SDK melyik verziójával fut, ellenőrizze az SDK verzióját fordításkor, vagy helyezze az API-hívást try/catch blokkba. Részletekért lásd a verzió adaptív kódját .

A háttérinformációkról és az API-szerződésekről ApiInformation lásd: Adaptív verziójú alkalmazások.

Feltételes névterek

Ha feltételes módszert szeretne használni az XAML-ben, deklaráljon egy feltételes XAML-névteret a lap tetején:

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

A határoló előtt lévő ? tartalom a névtér vagy séma. A ? utáni tartalom az a feltételes metódus, amely meghatározza, hogy a névtér true vagy false értékre értékelődik ki.

A legtöbb esetben a séma az alapértelmezett XAML-névtér:

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

A feltételes XAML a következő feltételes módszereket támogatja:

Módszer Inverz
IsApiContractPresent(ContractName, VersionNumber) IsApiContractNotPresent(ContractName, VersionNumber)
IsTypePresent(ControlType) IsTypeNotPresent(ControlType)
IsPropertyPresent(ControlType, PropertyName) IsPropertyNotPresent(ControlType, PropertyName)

Note

A legjobb tervezési idejű használhatóság érdekében használja a(z) IsApiContractPresent és IsApiContractNotPresent elemeket. Az egyéb feltételes feltételek nem támogatottak teljes mértékben a Visual Studio tervezési felületen.

Tulajdonság feltételes beállítása

Ez a példa csak akkor jeleníti meg a szövegetTextBlock, ha az alkalmazás Windows 10 1903-ban (2019. májusi frissítés, 18362-es build) vagy újabb verzióban fut – ez a szerződés-ellenőrzés azért fontos, mert az újabb, mint a Windows App SDK 1809-es emelete.

Először definiáljon egy feltételes névteret:

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

Ezután lássa el a tulajdonságot a feltételes névtér előtagjával:

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

Íme a teljes jelölőkód:

<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>

Az ezzel egyenértékű bejelentkezési kód a háttérben:

TextBlock textBlock = new TextBlock();

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

Note

Bár a(z) IsApiContractPresent a szerződésnév paramétereként karakterláncot fogad el, az XAML-névtér deklarációjában nem kell idézőjelek közé tenni.

Mivel a Windows App SDK minimálisan támogatott operációsrendszer-verziója 1809 (UniversalApiContract7-es verzió), a szerződés 7-es vagy újabb verziójának ellenőrzése mindig egy Windows App SDK-alkalmazásban történiktrue, és nem nyújt hasznos információt. Csak a 7-nél nagyobb szerződésverziókat ellenőrizze.

If/else feltételek használata

Ha az API-szerződéstől függően különböző értékeket szeretne beállítani, adja meg a pozitív és a negatív feltételes névtereket is:

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)"

Ezután állítsa be kétszer a tulajdonságot, mindegyikhez egy másik feltételes előtag tartozik. Futtatókörnyezetben csak egy van alkalmazva:

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

Vezérlők feltételes példányosítása

Note

Az operációsrendszer-API-szerződésen alapuló elem feltételes példányosítása – szemben a tulajdonság feltételes beállításával – UWP-specifikus minta. Ez nem vonatkozik a WinUI 3 vezérlőkre.

Az UWP-ben ez a minta lehetővé teszi, hogy visszatérjen egy régebbi Windows.UI.Xaml.Controls vezérlőhöz, amikor egy újabb nem volt elérhető az operációs rendszeren. Egy Windows App SDK-alkalmazásban a WinUI 3-vezérlők (Microsoft.UI.Xaml.Controls.*) az alkalmazás részeként, a Windows App SDK-n keresztül érkeznek, nem pedig az operációs rendszer részeként. Minden vezérlő, amelyre az alkalmazás épül — beleértve a(z) ColorPicker elemet is — garantáltan elérhető lesz futásidőben, így a példányosítása előtt nem kell ellenőrizni az operációs rendszer verzióját.

Ha egy WinUI 3-vezérlő vagy API használatát az alkalmazás által célzott Windows App SDK-verzióhoz kell kötni, ezt buildidőben tegye meg (a Windows App SDK-csomag minimális verziójának megadásával), vagy csomagolja a futásidejű hívást try/catch közé – ne feltételes XAML-lel.