Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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
- Um projeto do SDK de Aplicações Windows. Para os passos de configuração, consulte Criar a sua primeira aplicação WinUI 3.
- Familiaridade com aplicações adaptáveis à versão e com a
ApiInformationclasse.
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.
Conteúdo relacionado
Windows developer