在 Visual Studio 中通过 XAML 设计器使用设计时数据
有些布局没有数据很难进行可视化。 在本文档中,我们将审查从事桌面项目的开发人员可在 XAML 设计器中模拟数据的一种方法。 此方法是使用现有可忽略的“d:”命名空间来实现的。 利用这种方法,可快速将设计时数据添加到页面或控件中,而无需创建完整的模拟视图模型,或者只需测试属性更改会如何影响应用程序,而无需担心这些更改会影响你的发布版本。 所有 d: 数据仅由 XAML 设计器使用,无可忽略的命名空间值编译到应用程序中。
注意
如果你使用 Xamarin.Forms,请参阅 Xamarin.Forms 设计时数据
设计时数据基本信息
设计时数据是你设置的模拟数据,使控件更易于在 XAML 设计器中进行可视化。 首先,将以下代码行添加到 XAML 文档的标头(如果这些代码行尚不存在):
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
添加命名空间后,可将 d:
置于任何特性或控件之前,使其仅在 XAML 设计器中显示,而不在运行时显示。
例如,可将文本添加到通常绑定了数据的 TextBlock。
<TextBlock Text="{Binding Name}" d:Text="Name!" />
在此示例中,如果没有 d:Text
,则 XAML 设计器对于 TextBlock 不显示任何内容。 而是显示“Name!”,在此情况下,TextBlock 在运行时将具有实际数据。
可将 d:
与任何 UWP 或 WPF .NET Core 控件(如颜色、字号和间距)的特性结合使用。 甚至可以将其添加到控件本身。
<d:Button Content="Design Time Button" />
在此示例中,按钮仅在设计时显示。 使用此方法可为自定义控件放置占位符,或者可试用不同的控件。 在运行时期间,所有 d:
特性和控件都将被忽略。
在设计时预览图像
可为绑定到页面或动态加载的图像设置设计时源。 将要在 XAML 设计器中显示的图像添加到项目中。 然后,可在设计时在 XAML 设计器中显示该图像:
<Image Source={Binding ProfilePicture} d:Source="DesignTimePicture.jpg" />
注意
此示例中的图像必须存在于解决方案中。
ListView 的设计时数据
ListView 是一种在桌面应用中显示数据的常用方法。 但是,如果没有任何数据,ListView 就难以进行可视化。 可以使用此功能创建内联设计时数据 ItemSource 或 Items。 XAML 设计器在设计时在 ListView 中显示该数组中的内容。
WPF .NET Core 示例
若要使用 system:String 类型,请确保在 XAML 标头中包含 xmlns:system="clr-namespace:System;assembly=mscorlib
。
<StackPanel>
<ListView ItemsSource="{Binding Items}">
<d:ListView.ItemsSource>
<x:Array Type="{x:Type system:String}">
<system:String>Item One</system:String>
<system:String>Item Two</system:String>
<system:String>Item Three</system:String>
</x:Array>
</d:ListView.ItemsSource>
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ItemName}" d:Text="{Binding .}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
上一个示例显示了在 XAML 设计器中具有三个 TextBlock 的 ListView。
你也可以创建一个数据对象数组。 例如,可将 City
数据对象的公共属性构建为设计时数据。
namespace Cities.Models
{
public class City
{
public string Name { get; set; }
public string Country { get; set; }
}
}
若要在 XAML 中使用类,则必须在根节点中导入该命名空间。
xmlns:models="clr-namespace:Cities.Models"
<StackPanel>
<ListView ItemsSource="{Binding Items}">
<d:ListView.ItemsSource>
<x:Array Type="{x:Type models:City}">
<models:City Name="Seattle" Country="United States"/>
<models:City Name="London" Country="United Kingdom"/>
<models:City Name="Panama City" Country="Panama"/>
</x:Array>
</d:ListView.ItemsSource>
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<TextBlock Text="{Binding Name}" Margin="0,0,5,0" />
<TextBlock Text="{Binding Country}" />
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
这样做的好处是,你可将控件绑定到模型的设计时静态版本。
UWP 示例
UWP 不支持 x:Array。 因此,可以改用 <d:ListView.Items>
。 若要使用 system:String 类型,请确保在 XAML 标头中包含 http://schemas.microsoft.com/winfx/2009/xaml
。
<StackPanel>
<ListView>
<d:ListView.Items>
<system:String>Item One</system:String>
<system:String>Item Two</system:String>
<system:String>Item Three</system:String>
</d:ListView.Items>
</ListView>
</StackPanel>
将设计时数据与自定义类型和属性一起使用
默认情况下,此功能仅适用于平台控件和属性。 在本部分中,我们将执行所需的步骤,使你能够将自己的自定义控件用作设计时控件,这是面向使用 Visual Studio 2019 版本 16.8 或更高版本的客户提供的新功能。 要实现此操作,需要满足三个要求:
一个自定义 xmlns 命名空间
xmlns:myControls="http://MyCustomControls"
一个命名空间的设计时版本。 只需在末尾追加/设计即可实现。
xmlns:myDesignTimeControls="http://MyCustomControls/design"
将设计时前缀添加到 mc:Ignorable
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d myDesignTimeControls"
完成所有这些步骤后,可以使用 myDesignTimeControls
前缀来创建设计时控件。
<myDesignTimeControls:MyButton>I am a design time Button</myDesignTimeControls:MyButton>
创建自定义 xmlns 命名空间
若要在 WPF .NET Core 中创建自定义 xmlns 命名空间,需要将自定义 XML 命名空间映射到控件所在的 CLR 命名空间。 可通过在 AssemblyInfo.cs
文件中添加 XmlnsDefinition
程序集级别属性来实现此操作。 可在项目的根层次结构中找到该文件。
[assembly: XmlnsDefinition("http://MyCustomControls", "MyViews.MyButtons")]
疑难解答
如果你遇到此部分中未列出的问题,请通过使用报告问题工具来告知我们。
要求
设计时数据需要 Visual Studio 2019 版本 16.7 或更高版本。
支持定目标到适用于 .NET Core 的 Windows Presentation Foundation (WPF) 和 UWP 的 Windows 桌面项目。 也可以在预览频道中找到适用于 .NET Framework 的此功能。 若要启用此功能,请依次转到“工具”>“选项”>“环境”>“预览功能”,选择“适用于 .NET Framework 的新 WPF XAML 设计器”,然后重启 Visual Studio。
从 Visual Studio 2019 版本 16.7 开始,此功能适用于 WPF 和 UWP 框架中的所有内置控件。 16.8 版本现已提供对第三方控件的支持。
XAML 设计器停止工作
尝试关闭并重新打开 XAML 文件,清理并重新生成项目。