XAML condicional

XAML condicional permite usar el método ApiInformation.IsApiContractPresent directamente en el marcado XAML. Puede establecer propiedades en función de la presencia de un contrato de API de nivel de sistema operativo sin escribir código subyacente. Las instrucciones condicionales se evalúan en tiempo de ejecución: los elementos marcados con una etiqueta XAML condicional se analizan si se evalúan como true y, de lo contrario, se ignoran.

XAML condicional requiere Windows 10 versión 1809 (compilación 17763) o posterior, que es la versión mínima del sistema operativo para las aplicaciones de SDK de Aplicaciones para Windows.

Prerequisites

Importante

El XAML condicional usa métodos ApiInformation, que comprueban si existen contratos y tipos de API de Windows Runtime (Windows.*) suministrados por el sistema operativo. Estas comprobaciones no se aplican a los controles de WinUI 3 (Microsoft.UI.Xaml.*), ya que WinUI 3 se distribuye con la aplicación a través de la SDK de Aplicaciones para Windows en lugar de con el sistema operativo, cada control de WinUI 3 en el que se compila la aplicación siempre está presente en tiempo de ejecución, independientemente de la Windows 10/11 compilación en la que se ejecute el dispositivo. #if Las directivas del preprocesador tampoco ayudan aquí: se evalúan en tiempo de compilación en función del marco de destino, no en tiempo de ejecución en función del sistema operativo o de la versión de SDK de Aplicaciones para Windows realmente instalada. Para hacer que una característica dependa de la versión de SDK de Aplicaciones para Windows con la que se ejecuta la aplicación, compruebe la versión del SDK en tiempo de compilación o use un bloque try/catch alrededor de la llamada a la API. Consulte Código adaptable de versión para obtener más información.

Para obtener información general sobre ApiInformation y los contratos de API, consulte Aplicaciones adaptables a versiones.

Espacios de nombres condicionales

Para usar un método condicional en XAML, declare un espacio de nombres XAML condicional en la parte superior de la página:

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

El contenido anterior al ? delimitador es el espacio de nombres o el esquema. El contenido después de ? es el método condicional que determina si el espacio de nombres se evalúa en true o false.

En la mayoría de los casos, el esquema es el espacio de nombres XAML predeterminado:

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

Xaml condicional admite estos métodos condicionales:

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

Note

Use IsApiContractPresent y IsApiContractNotPresent para obtener la mejor experiencia en tiempo de diseño. Otros condicionales no se admiten completamente en la experiencia de diseño de Visual Studio.

Establecimiento de una propiedad de forma condicional

En este ejemplo, se muestra texto en un TextBlock solo cuando la aplicación se ejecuta en Windows 10, versión 1903 (Actualización de mayo de 2019, compilación 18362) o una versión posterior; una comprobación de contrato que tiene sentido porque es más reciente que la versión mínima 1809 de SDK de Aplicaciones para Windows.

En primer lugar, defina un espacio de nombres condicional:

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

A continuación, prefijo la propiedad con el espacio de nombres condicional:

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

Aquí está el código de marcado completo:

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

La comprobación equivalente en el código subyacente:

TextBlock textBlock = new TextBlock();

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

Note

Aunque IsApiContractPresent acepta una cadena para el parámetro del nombre del contrato, no debe ir entre comillas en la declaración de espacio de nombres XAML.

Dado que la versión mínima admitida del sistema operativo de SDK de Aplicaciones para Windows es 1809 (UniversalApiContract versión 7), comprobar una versión de contrato igual o inferior a 7 siempre se evalúa como true en una aplicación de SDK de Aplicaciones para Windows y no proporciona ninguna información útil. Compruebe solo las versiones de contrato superiores a 7.

Utilizar condiciones if/else

Para establecer valores diferentes en función del contrato de API, defina los espacios de nombres condicionales positivos y negativos:

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

A continuación, establezca la propiedad dos veces, cada una con un prefijo condicional diferente. Solo se aplica una en tiempo de ejecución:

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

Creación de instancias de controles de forma condicional

Note

Crear instancias condicionales de un elemento basado en un contrato de API del sistema operativo, en lugar de establecer condicionalmente una propiedad , es un patrón específico de UWP. No se aplica a los controles WinUI 3.

En UWP, este patrón te permite revertir a un control anterior Windows.UI.Xaml.Controls cuando uno más reciente no estaba disponible en el sistema operativo. En una aplicación de SDK de Aplicaciones para Windows, los controles winUI 3 (Microsoft.UI.Xaml.Controls.*) se envían con la aplicación a través del SDK de Aplicaciones para Windows, no con el sistema operativo. Se garantiza que cada control con el que se compila tu aplicación, incluido ColorPicker, estará presente en tiempo de ejecución, por lo que no es necesario comprobar la versión del sistema operativo antes de instanciarlo.

Si necesitas condicionar un control o una API de WinUI 3 a la versión de SDK de Aplicaciones para Windows a la que va dirigida tu aplicación, realiza esa comprobación en tiempo de compilación (estableciendo como destino una versión mínima del paquete de SDK de Aplicaciones para Windows) o encapsula la llamada en tiempo de ejecución en un try/catch, no con XAML condicional.