条件付き XAML は、 APIInformation.IsApiContractPresent メソッドを XAML マークアップで直接使用する方法を提供します。 コード ビハインドを記述することなく、OS レベルの API コントラクトの存在に基づいてプロパティを設定できます。 条件付きステートメントは実行時に評価されます。条件付き XAML タグで修飾された要素は、 true に評価された場合は解析され、それ以外の場合は無視されます。
条件付き XAML には、Windows 10 バージョン 1809 (ビルド 17763) 以降が必要です。これは、Windows アプリ SDK アプリの最小 OS バージョンです。
前提条件
- Windows アプリ SDK プロジェクト。 セットアップ手順については、 最初の WinUI 3 アプリの作成に関するページを参照してください。
-
バージョン アダプティブ アプリと
ApiInformationクラスに関する知識。
Important
条件付き XAML ではApiInformationメソッドを使用します。これは、OS によって提供されるWindows ランタイム (Windows.*) API コントラクトと型の有無を確認します。 これらのチェックは WinUI 3 () コントロールには適用Microsoft.UI.Xaml.*。WinUI 3 は OS ではなくWindows アプリ SDK経由でアプリに付属しているためです。アプリがビルドされるすべての WinUI 3 コントロールは、デバイスが実行されているWindows 10/11 ビルドに関係なく、常に実行時に存在します。
#ifプリプロセッサ ディレクティブもここでは役に立ちません。これらは、実際にインストールされている OS や Windows アプリ SDK のバージョンではなく、ターゲット フレームワークに基づいてコンパイル時に評価されるためです。 アプリが実行されているWindows アプリ SDKバージョンの機能をゲートするには、ビルド時に SDK のバージョンを確認するか、API 呼び出しの前後で try/catch を使用します。 詳細については、 バージョン アダプティブ コード を参照してください。
ApiInformationおよび API コントラクトの背景情報については、「バージョン アダプティブ アプリ」を参照してください。
条件付き名前空間
XAML で条件付きメソッドを使用するには、ページの上部で条件付き XAML 名前空間 を宣言します。
xmlns:myNamespace="schema?conditionalMethod(parameter)"
?区切り記号の前のコンテンツは、名前空間またはスキーマです。
?後のコンテンツは、名前空間がtrueまたはfalseに評価されるかどうかを決定する条件付きメソッドです。
ほとんどの場合、スキーマは既定の XAML 名前空間です。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
条件付き XAML では、次の条件付きメソッドがサポートされています。
| Method | 逆 |
|---|---|
IsApiContractPresent(ContractName, VersionNumber) |
IsApiContractNotPresent(ContractName, VersionNumber) |
IsTypePresent(ControlType) |
IsTypeNotPresent(ControlType) |
IsPropertyPresent(ControlType, PropertyName) |
IsPropertyNotPresent(ControlType, PropertyName) |
Note
IsApiContractPresentとIsApiContractNotPresentを使用して、最適なデザイン時エクスペリエンスを実現します。 その他の条件は、Visual Studio設計エクスペリエンスでは完全にはサポートされていません。
条件付きでプロパティを設定する
次の使用例は、Windows 10 バージョン 1903 (2019 年 5 月の更新プログラム、ビルド 18362) 以降でアプリが実行されている場合にのみ、TextBlockにテキストを表示します。これは、Windows アプリ SDKの 1809 フロアよりも新しいため意味のあるコントラクト チェックです。
まず、条件付き名前空間を定義します。
xmlns:contract8Present="http://schemas.microsoft.com/winfx/2006/xaml/presentation?IsApiContractPresent(Windows.Foundation.UniversalApiContract,8)"
次に、プロパティに条件付き名前空間のプレフィックスを付けます。
<TextBlock contract8Present:Text="Hello, Conditional XAML"/>
完全なマークアップを次に示します。
<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>
コードビハインドでの同等のチェック:
TextBlock textBlock = new TextBlock();
if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 8))
{
textBlock.Text = "Hello, Conditional XAML";
}
Note
IsApiContractPresentはコントラクト名パラメーターの文字列を受け取りますが、XAML 名前空間宣言で引用符で囲むことはありません。
Windows アプリ SDKのサポートされている最小 OS バージョンは 1809 (UniversalApiContract バージョン 7) であるため、7 以下のコントラクト バージョンを確認すると、常にWindows アプリ SDK アプリでtrueが評価され、有用な情報は提供されません。 7 より大きい コントラクト バージョンのみを確認します。
if/else 条件を使用する
API コントラクトに応じて異なる値を設定するには、正と負の両方の条件付き名前空間を定義します。
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)"
次に、プロパティを 2 回設定し、それぞれ異なる条件付きプレフィックスを使用します。 実行時に適用されるのは次の 1 つだけです。
<TextBlock contract8NotPresent:Text="Hello, World"
contract8Present:Text="Hello, May 2019 Update or later"/>
条件付きでコントロールをインスタンス化する
Note
条件付きでプロパティを設定するのではなく、OS API コントラクトに基づいて要素を条件付きでインスタンス化することは、UWP 固有のパターンです。 WinUI 3 コントロールには適用されません。
UWP では、このパターンを使用すると、OS で新しいコントロールを使用できなかった場合に、古い Windows.UI.Xaml.Controls コントロールにフォールバックできます。 Windows アプリ SDK アプリでは、WinUI 3 コントロール (Microsoft.UI.Xaml.Controls.*) は OS ではなく、Windows アプリ SDK経由でアプリに付属します。 アプリがビルドされるすべてのコントロール ( ColorPicker を含む) は実行時に存在することが保証されているため、インスタンス化する前に確認する OS バージョンはありません。
アプリがターゲットとするWindows アプリ SDKのバージョンで WinUI 3 コントロールまたは API をゲートする必要がある場合は、ビルド時にそのチェックを行うか (最小Windows アプリ SDK パッケージ バージョンをターゲットにして)、ランタイム呼び出しを条件付き XAML ではなくtry/catchでラップします。
関連するコンテンツ
Windows developer