Koşullu XAML

Koşullu XAML , ApiInformation.IsApiContractPresent yöntemini doğrudan XAML işaretlemesinde kullanmak için bir yol sağlar. Arkasında kod yazmadan işletim sistemi düzeyi API sözleşmesinin varlığına göre özellikleri ayarlayabilirsiniz. Koşullu ifadeler çalışma zamanında değerlendirilir; koşullu XAML etiketiyle nitelenen öğeler, değerlendirme sonucu true olursa ayrıştırılır, aksi takdirde yok sayılır.

Koşullu XAML, Windows Uygulama SDK'sı uygulamaları için en düşük işletim sistemi sürümü olan Windows 10 sürüm 1809 (derleme 17763) veya sonraki bir sürümü gerektirir.

Prerequisites

Important

Koşullu XAML, işletim sistemi tarafından sağlanan ApiInformation () API sözleşmelerinin ve türlerinin varlığını denetleyen yöntemleri kullanırWindows.*. Bu denetimler WinUI 3 () denetimleri için geçerli Microsoft.UI.Xaml.* çünkü WinUI 3, uygulamanızı işletim sistemi yerine Windows Uygulama SDK'sı üzerinden gönderir; uygulamanızın derlendiği her WinUI 3 denetimi, cihazın hangi Windows 10/11 derlemesinin çalıştığına bakılmaksızın her zaman çalışma zamanında bulunur. #if Önişlemci yönergeleri burada da işe yaramaz: bunlar, çalışma zamanında fiilen yüklü olan işletim sistemine veya Windows Uygulama SDK'sı sürümüne göre değil, derleme zamanında hedef çerçeveye göre değerlendirilir. Bir özelliği, uygulamanızın çalıştığı Windows Uygulama SDK'sı sürümüne göre kullanılabilir duruma getirmek için, derleme zamanında SDK sürümünü denetleyin veya API çağrısını bir try/catch bloğu içine alın. Ayrıntılar için bkz . Sürüm uyarlamalı kodu .

ApiInformation ve API sözleşmeleri hakkında arka plan bilgileri için Sürüm uyarlamalı uygulamalar bölümüne bakın.

Koşullu ad alanları

XAML'de koşullu bir yöntem kullanmak için sayfanızın üst kısmında bir koşullu XAML ad alanı bildirin:

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

Sınırlayıcıdan ? önceki içerik ad alanı veya şemadır. ? etiketinden sonraki içerik, ad alanının true mi yoksa false mi olarak değerlendirileceğini belirleyen koşullu yöntemdir.

Çoğu durumda şema varsayılan XAML ad alanıdır:

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

Koşullu XAML şu koşullu yöntemleri destekler:

Method Ters
IsApiContractPresent(ContractName, VersionNumber) IsApiContractNotPresent(ContractName, VersionNumber)
IsTypePresent(ControlType) IsTypeNotPresent(ControlType)
IsPropertyPresent(ControlType, PropertyName) IsPropertyNotPresent(ControlType, PropertyName)

Note

En iyi tasarım zamanı deneyimi için IsApiContractPresent ve IsApiContractNotPresent kullanın. Diğer koşullular, Visual Studio tasarım deneyiminde tam olarak desteklenmez.

Bir özelliği koşullu olarak ayarlama

Bu örnek, uygulama yalnızca Windows 10 sürüm 1903'te (Mayıs 2019 Güncelleştirmesi, derleme 18362) veya daha sonraki bir sürümde çalıştığında TextBlock içinde metin görüntüler; bu API sözleşmesi denetimi anlamlıdır çünkü Windows Uygulama SDK'sı'nın 1809 taban sürümünden daha yenidir.

İlk olarak, bir koşullu ad alanı tanımlayın:

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

Ardından özelliğine koşullu ad alanı ön eki ekleyin:

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

Tam işaretleme aşağıdadır:

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

Arka planda eşdeğer iade kodu:

TextBlock textBlock = new TextBlock();

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

Note

IsApiContractPresent, sözleşme adı parametresi için bir dize almasına rağmen, onu XAML ad alanı bildiriminde tırnak içine almazsınız.

Windows Uygulama SDK'sı’sinin desteklediği en düşük işletim sistemi sürümü 1809 (UniversalApiContract sürüm 7) olduğundan, 7 veya daha düşük bir sözleşme sürümünün denetlenmesi Windows Uygulama SDK'sı uygulamasında her zaman true sonucunu verir ve yararlı bir bilgi sağlamaz. Yalnızca 7'den yüksek sözleşme sürümlerini denetleyin.

If/else koşullarını kullanma

API sözleşmesine bağlı olarak farklı değerler ayarlamak için hem pozitif hem de negatif koşullu ad alanlarını tanımlayın:

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

Ardından, her birinin farklı bir koşullu ön eki olan özelliğini iki kez ayarlayın. Çalışma zamanında yalnızca bir tane uygulanır:

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

Denetimleri koşullu olarak oluşturma

Note

Bir öğeyi, bir özelliği koşullu olarak ayarlamak yerine işletim sistemi API sözleşmesine bağlı olarak koşullu biçimde örneklendirmek, UWP'ye özgü bir desendir. WinUI 3 denetimleri için geçerli değildir.

UWP'de bu düzen, işletim sisteminde daha yeni bir tane kullanılamadığında daha eski Windows.UI.Xaml.Controls bir denetime geri dönmenizi sağlar. Windows Uygulama SDK'sı kullanan bir uygulamada, WinUI 3 denetimleri (Microsoft.UI.Xaml.Controls.*) işletim sistemiyle değil, Windows Uygulama SDK'sı aracılığıyla uygulamanızla birlikte gelir. Uygulamanızın hedef alarak derlendiği her denetimin — ColorPicker dahil — çalışma zamanında mevcut olması garanti edilir; bu nedenle örneğini oluşturmadan önce kontrol etmeniz gereken bir işletim sistemi sürümü yoktur.

Uygulamanızın hedeflediği Windows Uygulama SDK'sı sürümüne göre bir WinUI 3 denetiminin veya API’sinin kullanımını koşullandırmanız gerekiyorsa, bu denetlemeyi derleme zamanında yapın (minimum bir Windows Uygulama SDK'sı paket sürümünü hedefleyerek) ya da çalışma zamanı çağrısını try/catch içine sarın — koşullu XAML ile değil.