XAML condicional

O XAML condicional fornece uma forma de usar o método ApiInformation.IsApiContractPresent diretamente na marcação XAML. Pode definir propriedades com base na presença de um contrato de API ao nível do sistema operativo sem escrever código por trás. As instruções condicionais são avaliadas em tempo de execução — os elementos qualificados com uma tag XAML condicional são processados caso sejam avaliados como true e ignorados caso contrário.

O XAML condicional requer a versão 1809 do Windows 10 (build 17763) ou posterior, que é a versão mínima do sistema operativo para aplicações do SDK de Aplicações Windows.

Pré-requisitos

Importante

O XAML condicional utiliza ApiInformation métodos que verificam a presença de contratos e tipos de API do Windows Runtime (Windows.*) fornecidos pelo sistema operativo. Estas verificações não se aplicam aos controlos do WinUI 3 (Microsoft.UI.Xaml.*), porque o WinUI 3 vem com a sua aplicação através do SDK de Aplicações Windows em vez do sistema operativo — todos os controlos do WinUI 3 contra os quais a sua aplicação está construída estão sempre presentes em tempo de execução, independentemente da versão Windows 10/11 que o dispositivo esteja a usar. #ifAs diretivas do pré-processador também não ajudam aqui: são avaliadas em tempo de compilação com base no framework de destino, não em tempo de execução com base no sistema operativo ou na versão do SDK de Aplicações Windows realmente instalada. Para bloquear uma funcionalidade na versão do SDK de Aplicações Windows contra a qual a tua aplicação está a correr, verifica a versão do SDK no momento da compilação ou usa um try/catch para contornar a chamada da API. Consulte o código adaptativo da versão para mais detalhes.

Para informações gerais sobre ApiInformation e contratos de API, consulte aplicações adaptáveis à versão.

Espaços de nomes condicionais

Para usar um método condicional em XAML, declare um namespace XAML condicional no topo da sua página:

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

O conteúdo antes do ? delimitador é o namespace ou esquema. O conteúdo após ? é o método condicional que determina se o namespace avalia como true ou false.

Na maioria dos casos, o esquema é o namespace padrão XAML:

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

O XAML condicional suporta estes métodos condicionais:

Método Inverso
IsApiContractPresent(ContractName, VersionNumber) IsApiContractNotPresent(ContractName, VersionNumber)
IsTypePresent(ControlType) IsTypeNotPresent(ControlType)
IsPropertyPresent(ControlType, PropertyName) IsPropertyNotPresent(ControlType, PropertyName)

Note

Utilize IsApiContractPresent e IsApiContractNotPresent para uma melhor experiência em tempo de conceção. Outros condicionais não são totalmente suportados na experiência de design do Visual Studio.

Definir uma propriedade condicionalmente

Este exemplo mostra texto num TextBlock apenas quando a aplicação é executada no Windows 10, versão 1903 (Atualização de maio de 2019, build 18362) ou posterior — uma verificação de contrato que faz sentido porque é mais recente do que a versão mínima 1809 do SDK de Aplicações Windows.

Primeiro, defina um espaço de nomes condicional:

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

Depois, prefixe a propriedade com o namespace condicional:

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

Aqui está a margem completa:

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

O código de check-in equivalente abaixo:

TextBlock textBlock = new TextBlock();

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

Note

Mesmo que IsApiContractPresent aceite uma cadeia de caracteres para o parâmetro de nome de contrato, não o deve colocar entre aspas na declaração do espaço de nomes XAML.

Como a versão mínima do SO suportada pelo SDK de Aplicações Windows é a 1809 (UniversalApiContract versão 7), verificar uma versão do contrato igual ou inferior a 7 resulta sempre em true numa aplicação do SDK de Aplicações Windows e não fornece qualquer informação útil. Verifica apenas versões do contrato superiores a 7.

Utilize condições if/else

Para definir valores diferentes dependendo do contrato API, defina tanto os namespaces condicionais positivo como negativo:

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

Depois define a propriedade duas vezes, cada uma com um prefixo condicional diferente. Apenas um é aplicado em tempo de execução:

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

Instanciar controlos condicionalmente

Note

Instanciar condicionalmente um elemento com base num contrato da API do OS — em oposição a definir condicionalmente uma propriedade — é um padrão específico do UWP. Não se aplica aos controlos do WinUI 3.

No UWP, este padrão permitia-te voltar a um controlo mais antigo Windows.UI.Xaml.Controls quando um mais recente não estava disponível no sistema operativo. Numa aplicação do SDK de Aplicações Windows, os controlos do WinUI 3 (Microsoft.UI.Xaml.Controls.*) vêm com a sua aplicação através do SDK de Aplicações Windows, não do sistema operativo. Cada controlo contra o qual a sua aplicação é construída — incluindo ColorPicker — está garantido presente em tempo de execução, por isso não há uma versão do sistema operativo para verificar antes de a instanciar.

Se precisares de condicionar a utilização de um controlo ou de uma API do WinUI 3 à versão do SDK de Aplicações Windows visada pela tua aplicação, faz essa verificação no momento da compilação (definindo uma versão mínima do pacote SDK de Aplicações Windows) ou envolve a chamada em tempo de execução num try/catch — e não com XAML condicional.