UWP
创建和自定义窗体| Microsoft Learn
表单中有哪些内容?
需要用各种 XAML 控件填充表单。 你可能熟悉这些内容,但如果需要刷新,可以随意阅读。 具体而言,你需要允许用户输入文本或从值列表中选择的控件。 这是可以添加的选项的基本列表 - 你不需要阅读有关它们的所有内容,只是足以让你了解它们的外观及其工作原理。
- TextBox 允许用户将文本输入到应用中。
- ToggleSwitch 允许用户在两个选项之间进行选择。
- DatePicker 允许用户选择日期值。
- TimePicker 允许用户选择时间值。
- ComboBox 展开以显示可选择项目的列表。 您可以在这里 了解更多关于它们的信息
你可能还需要添加 按钮,以便用户可以保存或取消。
设置布局中的控件格式
你知道如何排列布局面板并具有要添加的项目,但应如何设置其格式? 窗体 页面具有一些特定的设计指南。 阅读有关表单类型 和 布局 的部分,以获取有用的建议。 我们将很快讨论辅助功能和相对布局。
使您的布局具有响应式设计
用户可能会在具有不同屏幕宽度的各种设备上查看 UI。 为了确保无论屏幕如何,他们都有良好的体验,应使用 响应式设计。 阅读该页,了解设计理念方面的良好建议,以便在继续作时记住这一点。
有用的 API
| API(应用程序编程接口) | DESCRIPTIONDESCRIPTION |
|---|---|
| 适用于表单的控件适用于表单的控件 | 用于创建表单的有用输入控件列表,以及有关如何使用表单的基本指南。用于创建表单的有用输入控件列表,以及有关如何使用表单的基本指南。 |
| 网格 | 用于排列多行和多列布局中的元素的面板。 |
| RelativePanel | 用于将项目相对于其他元素和面板边界进行排列的面板。 |
| 堆叠面板(StackPanel) | 用于将元素排列为单个水平线或垂直线的面板。 |
| VisualState | 允许在 UI 元素处于特定状态时设置 UI 元素的外观。 |
| 事件概述 | 有关添加和组织事件以处理UI操作的详细信息。 |
| 表单 | 有关创建表单的总体指南。 |
| 布局面板 | 概述布局面板的类型以及使用位置。 |
| 列表/详细信息模式 | 可以围绕一个或多个表单实现的设计模式。 |
| NavigationView (导航视图) | 可以包含一个或多个窗体的控件。 |
| 响应式设计 | 大规模响应式设计原则概述。 |
| 使用 XAML 进行响应式布局 | 有关视觉状态和其他响应式设计实现的特定信息。 |
| 响应式设计的 屏幕大小 | 关于应将响应式布局限定到哪些屏幕大小的指南。事件概述 |
有用的代码示例
| 代码示例 | DESCRIPTION |
|---|---|
| 客户订单数据库 | 亲眼见证多页企业示例中布局和表单的实际应用。 |
| XAML 控件库 | 查看一系列 XAML 控件及其实现方式。 |
| 其他代码示例 | 在类别下拉列表中选择 “控件”、“布局”和“文本 ”以查看相关的代码示例。 |
窗体
表单是一组控件,用于收集和提交来自用户的数据。 表单通常用于设置页面、调查、创建帐户,等等。
窗体类型
考虑用户输入的提交和显示方式时,可以使用两种类型的表单:
1. 即时更新
如果希望用户立即看到更改表单中的值会有什么样的结果,请使用即时更新表单。
2. 使用按钮提交
另一类型的表单允许用户通过单击某个按钮来选择何时提交数据。
此类表单允许用户灵活进行响应。 通常情况下,此类表单包含更多自由的表单输入字段,因此会收到更多种类的响应。 若要确保提交后的用户输入有效且数据格式正常,请考虑以下建议:
- 使用正确的控件,确保无法提交无效的信息(也就是说,对日历日期要使用 CalendarDatePicker 而不是 TextBox)。 若要详细了解如何在表单中选择适当的输入控件,请参阅后面的“输入控件”部分。
- 使用 TextBox 控件时,请使用 PlaceholderText 属性向用户提示所需的输入格式。
- 使用 InputScope 属性指出预期的控件输入,为用户提供适当的屏幕键盘。
- 在标签上将必需的输入标记为星号 *。
- 在用户填完所有必需信息之前,禁用提交按钮。
- 如果提交后存在无效数据,请对包含无效输入的控件使用突出显示的字段或边框进行标记,并要求用户重新提交表单。
- 对于其他错误(例如网络连接失败),请务必向用户显示相应的错误消息。
Layout
若要简化用户体验,确保用户能够进行正确的输入,请在设计表单的布局时考虑以下建议:
标签
标签应该左对齐并放置在输入控件上方。 许多控件都有用于显示标签的内置 Header 属性。 对于没有 Header 属性的控件,或要为多组控件添加标签,你可以改用 TextBlock。
在针对辅助功能进行设计时,请将所有的单个控件和控件组进行标记,使用户和屏幕阅读器都能清楚地看到。
对于字体样式,请使用默认的 Windows 类型渐变。 将 TitleTextBlockStyle 用于页面标题,将 SubtitleTextBlockStyle 用于组标题,将 BodyTextBlockStyle 用于控件标签。
间距
若要在视觉上将控件组彼此分开,请使用对齐、边距和填充。 单个输入控件的高度为 80px,应该隔开 24px 的距离。 输入控件组应该隔开 48px 的距离。
列
创建列可以减少表单中不必要的空白,尤其是在屏幕大小较大的情况下。 但是,若要创建多列表单,则列数应该取决于页面上的输入控件数以及应用窗口的屏幕大小。 可以考虑为表单创建多个页面,而不是让屏幕充斥各种输入控件。
响应性强的布局
表单应该在屏幕或窗口大小变化时重设大小,这样用户就不会忽略任何输入字段。 有关详细信息,请参阅响应式设计技术。 例如,可能需要让表单的特定区域始终位于视图中,不管屏幕大小如何变化。
制表位
用户可以使用键盘,通过制表位来导航控件。 默认情况下,控件的 Tab 键顺序反映了其在 XAML 中的创建顺序。 若要覆盖默认的行为,请更改控件的 IsTabStop 或 TabIndex 属性。
输入控件
输入控件是 UI 元素,允许用户将信息输入表单中。 下面列出了一些可以添加到表单中的常用控件,并介绍了何时使用它们。
文本输入
| 控制 | 使用 | 示例 |
|---|---|---|
| TextBox | 捕获一个或多个文本行 | 名称、自由表单响应或反馈 |
| PasswordBox | 通过隐藏字符来收集专用数据 | 密码、社会安全号码 (SSN)、PIN、信用卡信息 |
| AutoSuggestBox | 当用户键入时,从相应的一组数据中选择一系列建议显示给用户 | 数据库搜索、mail to: 行、以前的查询 |
| RichEditBox | 使用格式化文本、超链接和图像编辑文本文件 | 在应用中上传文件,然后进行预览和编辑 |
选择
| 控制 | 使用 | 示例 |
|---|---|---|
| CheckBox | 选择或取消选择一个或多个操作项 | 同意条款和条件,添加可选项,选择所有适用的内容 |
| RadioButton | 从两个或多个选项中选择一个选项 | 选取类型、送货方式等 |
| ToggleSwitch | 从两个互斥选项中选择一个 | 打开/关闭 |
···注意:如果有五个或更多选择项,请使用列表控件。···
列表
| 控制 | 使用 | 示例 |
|---|---|---|
| ComboBox | 最初处于紧凑状态,可展开以显示可选择项的列表 | 从项(例如州或国家/地区)的长列表中进行选择 |
| ListView | 对项进行分类并为之分配组标头、拖放项、规划内容以及重新对项进行排序 | 分级选项 |
| GridView | 排列和浏览基于图像的集合 | 选取照片、颜色、显示主题 |
数字输入
| 控制 | 使用 | 示例 |
|---|---|---|
| 滑块 | 从一系列相邻的数字值中选择一个数字 | 百分比、音量、播放速度 |
| 评级 | 使用星号评级 | 客户反馈 |
日期和时间
| 控制 | 使用 |
|---|---|
| CalendarView | 从始终可见的日历中选取一个日期或日期范围 |
| CalendarDatePicker | 从上下文日历中选取一个日期 |
| DatePicker | 在上下文信息不重要时选取一个本地化的日期 |
| TimePicker | 选取一个时间值 |
其他控制
如需 UWP 控件的完整列表,请参阅按功能排序的控件索引。
如需更多复杂的自定义 UI 控件,请查看 Telerik、SyncFusion、DevExpress、Infragistics、ComponentOne、ActiPro 等公司提供的资源。
在列表中显示客户
在 UI 中显示和操作真实数据对于许多应用程序的功能至关重要。 本文将向你介绍需要了解的内容,以便在列表中显示客户对象集合。
这不是教程。 如果需要,请参阅 我们的数据绑定教程,该教程将提供分步引导式体验。
我们将首先快速讨论数据绑定,即什么是数据绑定以及它如何工作。 然后,我们将向 UI 添加 ListView ,添加数据绑定,并使用其他功能自定义数据绑定。
数据绑定是在其 UI 中显示应用数据的一种方法。 这样就可以在应用中 分离关注点,使 UI 与其他代码分开。 这会创建一个更简洁的概念模型,更易于阅读和维护。
每个数据绑定都有两个部分:
- 提供要绑定的数据的源。
- 显示数据的 UI 中的目标。
若要实现数据绑定,需要向源添加代码,以便向绑定提供数据。 还需要向 XAML 添加两个标记扩展之一来指定数据源属性。 下面是两者之间的主要区别:
- x:Bind 是强类型化的,并在编译时生成代码以提高性能。 x:Bind 默认为一次性绑定,这种绑定针对只读且不更改的数据的快速显示进行了优化。
- 绑定 在运行时处于弱类型化和组装状态。 这会导致性能低于使用 x:Bind 时。 几乎所有情况下,都应使用 x:Bind 而不是 Binding。 但是,你可能在较旧的代码中遇到它。 绑定默认为单向数据传输,这对来源可变的只读数据进行了优化。
数据绑定示例
创建数据源
首先,需要一个类来表示客户数据。 为了给您提供参考点,我们将在这个简单示例中演示该过程。
public class Customer
{
public string Name { get; set; }
}
创建列表
在显示任何客户之前,需要创建列表来保存这些客户。 列表视图是一个基本 XAML 控件,非常适合此任务。 ListView 当前需要页面上的位置,并且很快需要其 ItemSource 属性的值。
<ListView ItemsSource=""
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
将数据绑定到列表
现在,你已制作了一个用于保存绑定的基本 UI,需要配置源以提供它们。 下面是如何完成此操作的示例:
C#
public sealed partial class MainPage : Page
{
public ObservableCollection<Customer> Customers { get; }
= new ObservableCollection<Customer>();
public MainPage()
{
this.InitializeComponent();
// Add some customers
this.Customers.Add(new Customer() { Name = "NAME1"});
this.Customers.Add(new Customer() { Name = "NAME2"});
this.Customers.Add(new Customer() { Name = "NAME3"});
}
}
XAML
<ListView ItemsSource="{x:Bind Customers}"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Customer">
<TextBlock Text="{x:Bind Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>