Bedingtes XAML

Bedingter XAML-Code bietet eine Möglichkeit, die ApiInformation.IsApiContractPresent-Methode direkt im XAML-Markup zu verwenden. Sie können Eigenschaften basierend auf dem Vorhandensein eines API-Vertrags auf Betriebssystemebene festlegen, ohne Code-Behind zu schreiben. Bedingte Anweisungen werden zur Laufzeit ausgewertet – Elemente, die mit einem bedingten XAML-Tag qualifiziert sind, werden geparst, wenn sie den Wert true ergeben, andernfalls werden sie ignoriert.

Bedingter XAML-Code erfordert Windows 10 Version 1809 (Build 17763) oder höher, was die Mindestversion des Betriebssystems für Windows App SDK-Apps ist.

Prerequisites

Important

Bedingter XAML-Code verwendet ApiInformation Methoden, die das Vorhandensein von Windows-Runtime (Windows.*)-API-Verträgen und -Typen überprüfen, die vom Betriebssystem bereitgestellt werden. Diese Prüfungen gelten nicht für WinUI 3 (Microsoft.UI.Xaml.*)-Steuerelemente, da WinUI 3 mit Ihrer App über das Windows App SDK statt mit dem Betriebssystem ausgeliefert wird – jedes WinUI 3-Steuerelement, für das Ihre App erstellt wird, ist zur Laufzeit immer vorhanden, unabhängig davon, für welche Windows 10/11-Build das Gerät ausgeführt wird. #if Präprozessordirektiven helfen auch hier nicht weiter: Sie werden zum Kompilierungszeitpunkt anhand des Zielframeworks ausgewertet, nicht zur Laufzeit auf Grundlage des tatsächlich installierten Betriebssystems oder der tatsächlich installierten Version des Windows App SDK. Um die Verfügbarkeit einer Funktion von der Windows App SDK-Version abhängig zu machen, mit der Ihre App ausgeführt wird, überprüfen Sie die SDK-Version zur Buildzeit, oder schließen Sie den API-Aufruf in einen Try/Catch-Block ein. Weitere Informationen finden Sie unter Versionsadaptiver Code.

Hintergrundinformationen zu ApiInformation Und API-Verträgen finden Sie unter Versionsadaptive Apps.

Bedingte Namespaces

Um eine bedingte Methode in XAML zu verwenden, deklarieren Sie oben auf der Seite einen bedingten XAML-Namespace :

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

Der Inhalt vor dem ? Trennzeichen ist der Namespace oder das Schema. Der Inhalt nach ? ist die bedingte Methode, die bestimmt, ob der Namespace als true oder false ausgewertet wird.

In den meisten Fällen ist das Schema der standardmäßige XAML-Namespace:

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

Bedingter XAML-Code unterstützt diese bedingten Methoden:

Methode Invers
IsApiContractPresent(ContractName, VersionNumber) IsApiContractNotPresent(ContractName, VersionNumber)
IsTypePresent(ControlType) IsTypeNotPresent(ControlType)
IsPropertyPresent(ControlType, PropertyName) IsPropertyNotPresent(ControlType, PropertyName)

Note

Verwenden Sie IsApiContractPresent und IsApiContractNotPresent für die beste Entwurfszeiterfahrung. Andere Bedingungen werden in der Entwurfsoberfläche Visual Studio nicht vollständig unterstützt.

Eine Eigenschaft bedingt festlegen

In diesem Beispiel wird Text TextBlock nur angezeigt, wenn die App auf Windows 10 Version 1903 (Update vom Mai 2019, Build 18362) oder höher ausgeführt wird – eine Vertragsüberprüfung, die aussagekräftig ist, da sie neuer als die 1809 Etage des Windows App SDK ist.

Definieren Sie zunächst einen bedingten Namespace:

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

Stellen Sie dann der Eigenschaft den bedingten Namespace voran:

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

Hier ist das gesamte Markup:

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

Die entsprechende Überprüfung im CodeBehind:

TextBlock textBlock = new TextBlock();

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

Note

IsApiContractPresent Obwohl eine Zeichenfolge für den Vertragsnamenparameter verwendet wird, fügen Sie sie nicht in Anführungszeichen in die XAML-Namespacedeklaration ein.

Da die mindestens unterstützte Betriebssystemversion des Windows App SDK 1809 (UniversalApiContract Version 7) ist, ergibt die Überprüfung, ob eine Contract-Version 7 oder niedriger ist, in einer Windows App SDK-App immer true und liefert keine nützlichen Informationen. Überprüfen Sie nur auf Vertragsversionen , die höher als 7 sind.

Verwenden von If/Else-Bedingungen

Um je nach API-Vertrag unterschiedliche Werte festzulegen, definieren Sie sowohl die positiven als auch negativen bedingten Namespaces:

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

Legen Sie dann die Eigenschaft zweimal fest, jeweils mit einem anderen bedingten Präfix. Zur Laufzeit wird nur eins angewendet:

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

Steuerelemente bedingt instanziieren

Note

Das bedingte Instanziieren eines Elements basierend auf einem Betriebssystem-API-Vertrag – im Gegensatz zum bedingten Festlegen einer Eigenschaft – ist ein UWP-spezifisches Muster. Sie gilt nicht für WinUI 3-Steuerelemente.

In UWP können Sie mit diesem Muster auf ein älteres Windows.UI.Xaml.Controls Steuerelement zurückgreifen, wenn ein neueres Steuerelement im Betriebssystem nicht verfügbar war. In einer Windows App SDK App werden WinUI 3-Steuerelemente (Microsoft.UI.Xaml.Controls.*) mit Ihrer App über die Windows App SDK ausgeliefert, nicht mit dem Betriebssystem. Jedes Steuerelement, mit dem Ihre App erstellt wird – einschließlich ColorPicker – ist garantiert zur Laufzeit vorhanden, sodass es keine Betriebssystemversion gibt, die überprüft werden kann, bevor sie instanziiert wird.

Wenn Sie ein WinUI 3-Steuerelement oder eine WinUI 3-API von der Version des Windows App SDK abhängig machen müssen, auf die Ihre App abzielt, führen Sie diese Prüfung zur Buildzeit durch (indem Sie eine Windows App SDK-Paketversion als Mindestversion festlegen) oder kapseln Sie den Laufzeitaufruf in try/catch – nicht mit bedingtem XAML.