XAML プレビューアーでデザイン時のデータを使用する

一部のレイアウトでは、データなしで視覚化するのが困難です。 これらのヒントを使用して、XAML プレビューアーでデータが多いページのプレビューを最大限に活用してください。

警告

XAML プレビューアーは、Visual Studio 2019 バージョン 16.8 と Visual Studio 2019 for Mac バージョン 8.8 で非推奨になり、Visual Studio 2019 バージョン 16.9 と Visual Studio for Mac バージョン 8.9 で XAML ホット リロードに置き換えられています。 XAML ホット リロードの詳細については、こちらのドキュメントを参照してください。

Note

Windows Presentation Foundation (WPF) または UWP を使用する場合は、デスクトップ アプリケーションについて XAML デザイナーでデザイン時のデータを使用する方法に関する記事を参照してください

デザイン時のデータの基本

デザイン時のデータは、XAML プレビューアーでのコントロールの視覚化を簡単にするために設定する模造データです。 まず初めに、次のコード行を XAML ページのヘッダーに追加します。

xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"

名前空間を追加したら、d: をすべての属性やコントロールの前に配置して、その属性やコントロールが XAML プレビューアーに表示されるようにできます。 d: が付いた要素は実行時には表示されません。

たとえば、通常はデータがバインドされているラベルにテキストを追加できます。

<Label Text="{Binding Name}" d:Text="Name!" />

Design time data with text in a Label

この例では、d:Text がないと、ラベルに対して XAML プレビューアーは何も表示しません。 ここには、その代わりに "Name!" と表示されています。このラベルには実行時には実際のデータが設定されます。

d: は、色、フォント サイズ、間隔などの、Xamarin.Forms コントロールの任意の属性で使用できます。 これを次のようにコントロール自体にも追加できます。

<d:Button Text="Design Time Button" />

Design time data with a Button control

この例では、ボタンはデザイン時にのみ表示されます。 XAML プレビューアーでサポートされていないカスタム コントロールに対してプレースホルダーを配置するには、この方法を使用してください。

デザイン時に画像をプレビューする

ページにバインドされているか、動的に読み込まれる画像に対して、デザイン時のソースを設定できます。 Android プロジェクトでは、XAML プレビューアーに表示する画像を Resources > Drawable フォルダーに追加します。 iOS プロジェクトでは、画像を Resources フォルダーに追加します。 これで、デザイン時にその画像を XAML プレビューアーに表示できます。

<Image Source={Binding ProfilePicture} d:Source="DesignTimePicture.jpg" />

Design time data with images

ListView のデザイン時のデータ

ListView は、モバイル アプリにデータを表示する一般的な方法です。 ただし、実際のデータなしに視覚化することは困難です。 これに対してデザイン時のデータを使用するには、ItemsSource として使用するデザイン時の配列を作成する必要があります。 XAML プレビューアーには、デザイン時に ListView に存在する配列の内容が表示されます。

<StackLayout>
    <ListView ItemsSource="{Binding Items}">
        <d:ListView.ItemsSource>
            <x:Array Type="{x:Type x:String}">
                <x:String>Item One</x:String>
                <x:String>Item Two</x:String>
                <x:String>Item Three</x:String>
            </x:Array>
        </d:ListView.ItemsSource>
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextCell Text="{Binding ItemName}"
                          d:Text="{Binding .}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

Design time data with a ListView

この例は、XAML プレビューアーに 3 つの TextCell の ListView を表示します。 x:String は、プロジェクト内の既存のデータ モデルに変更できます。

また、データ オブジェクトの配列を作成することもできます。 たとえば、Monkey データ オブジェクトのパブリック プロパティを、次のようにデザイン時のデータとして構築できます。

namespace Monkeys.Models
{
    public class Monkey
    {
        public string Name { get; set; }
        public string Location { get; set; }
    }
}

XAML でクラスを使用するには、次のようにルート ノードに名前空間をインポートする必要があります。

xmlns:models="clr-namespace:Monkeys.Models"
<StackLayout>
    <ListView ItemsSource="{Binding Items}">
        <d:ListView.ItemsSource>
            <x:Array Type="{x:Type models:Monkey}">
                <models:Monkey Name="Baboon" Location="Africa and Asia"/>
                <models:Monkey Name="Capuchin Monkey" Location="Central and South America"/>
                <models:Monkey Name="Blue Monkey" Location="Central and East Africa"/>
            </x:Array>
        </d:ListView.ItemsSource>
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="models:Monkey">
                <TextCell Text="{Binding Name}"
                          Detail="{Binding Location}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

ここでの利点は、使用する予定の実際のモデルにバインドできることです。

代替: 静的 ViewModel をハードコードする

デザイン時のデータを個々のコントロールに追加したくない場合は、ページにバインドするモック データ ストアをセットアップできます。 XAML で静的 ViewModel にバインドする方法については、James Montemagno のデザイン時のデータの追加に関するブログ投稿を参照してください。

トラブルシューティング

要件

デザイン時のデータに必要な最小バージョンは Xamarin.Forms 3.6 です。

IntelliSense がデザイン時のデータの下に波線を表示する

これは、既知の問題であり、Visual Studio の近日公開されるバージョンで修正される予定です。 このままでも、プロジェクトはエラーなしでビルドされます。

XAML プレビューアーの動作が停止した

XAML ファイルを閉じて再度開き、プロジェクトのクリーンアップとリビルドを試してみてください。