通过 XAML 预览器使用设计时数据

有些布局没有数据很难进行可视化。 按这些提示可以最大限度地利用 XAML 预览器来预览数据密集型页面。

警告

XAML 预览器已在 Visual Studio 2019 版本 16.8 和 Visual Studio for Mac 版本 8.8 中弃用,并替换为 Visual Studio 2019 版本 16.9 和 Visual Studio for Mac 版本 8.9 中的 XAML 热重载功能。 在文档中详细了解 XAML 热重载。

注意

如果使用 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 预览器中显示的图像添加到“资源”>“可绘制”文件夹。 在 iOS 项目中,将图像添加到“资源”文件夹。 然后,即可在设计时在 XAML 预览器中显示该图像:

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

Design time data with images

ListView 的设计时数据

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 预览器中显示三个 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 进行硬编码

如果不想向单个控件添加设计时数据,则可以设置模拟数据存储来绑定到页面。 请参阅 James Montemagno 关于添加设计时数据的博客文章,了解如何在 XAML 中绑定到静态 ViewModel。

疑难解答

要求

设计时数据需要最低版本 Xamarin.Forms 3.6。

IntelliSense 在设计时数据下显示波浪线

这是一个已知问题,将在即将发布的 Visual Studio 版本中修复。 项目仍然会顺利生成,没有错误。

XAML 预览器停止工作

尝试关闭并重新打开 XAML 文件,清理并重新生成项目。