创建和自定义表单

如果你正在创建一个需要用户输入大量信息的应用,可以创建一个表单供用户填写信息。本文将会介绍有关创建有用且功能强大的表单方面的知识。

我们将讨论表单包含哪些 XAML 控件,如何最好地在页面上安排它们,以及如何为不同的屏幕大小优化表单。 但由于表单的核心内容在于视觉元素的相对位置,因此我们先讨论使用 XAML 时的页面布局。

需要了解哪些内容?

UWP 没有可添加到应用并进行配置的专门表单控件。 因此,需要通过在页面上安排一组 UI 元素来创建表单。

为此,你需要了解布局面板。 布局面板是容纳应用 UI 元素的容器,允许你安排 UI 元素和进行分组。 将布局面板放置在其他布局面板中,可以很好地控制一个项目相对于其他项目的位置和显示方式。 这也可以让应用更轻松地适应不同的屏幕大小。

请参阅布局面板文档。 表单通常显示在一个或多个垂直列中,因此需要将相似项目分组到 StackPanel 中,并根据需要将它们安排到 RelativePanel 中。 现在我们开始组织一些面板 - 如果需要参考,下面是两列表单的基本布局框架:

<RelativePanel>
    <StackPanel x:Name="Customer" Margin="20">
        <!--Content-->
    </StackPanel>
    <StackPanel x:Name="Associate" Margin="20" RelativePanel.RightOf="Customer">
        <!--Content-->
    </StackPanel>
    <StackPanel x:Name="Save" Orientation="Horizontal" RelativePanel.Below="Customer">
        <!--Save and Cancel buttons-->
    </StackPanel>
</RelativePanel>

表单包含哪些元素?

需要使用各种 XAML 控件填充表单。 你可能对这些控件很熟悉,但如果需要复习,请重温以下参考资料。 特别是,你需要允许用户输入文本或从值列表中进行选择的控件。 以下是可以添加的选项的基本列表 - 不必掌握有关它们的一切内容,只需要了解它们的外观及其工作方式。

  • TextBox 让用户向应用中输入文本。
  • ToggleSwitch 让用户从两个选项中做出选择。
  • DatePicker 让用户选择一个日期值。
  • TimePicker 让用户选择一个时间值。
  • ComboBox 展开以显示可选项目的列表。 可在此处了解相关详细信息。

可能还需要添加按钮,以便用户可以保存或取消。

在布局中格式化控件

你知道如何安排布局面板和如何添加所需项目,但该如何格式化它们呢? 表单页面有一些特定的设计指南。 请阅读表单类型布局部分,以获取有用的建议。 很快我们将讨论辅助功能和相对布局。

请牢记以下建议:在向布局中添加选择的控件时,请确保为其分配标签和提供适当的间隔。 例如,下面是采用上述布局、控件和设计指南的单页表单的基本框架:

<RelativePanel>
    <StackPanel x:Name="Customer" Margin="20">
        <TextBox x:Name="CustomerName" Header= "Customer Name" Margin="0,24,0,0" HorizontalAlignment="Left" />
        <TextBox x:Name="Address" Header="Address" PlaceholderText="Address" Margin="0,24,0,0" HorizontalAlignment="Left" />
        <TextBox x:Name="Address2" Margin="0,24,0,0" PlaceholderText="Address 2" HorizontalAlignment="Left" />
            <RelativePanel>
                <TextBox x:Name="City" PlaceholderText="City" Margin="0,24,0,0" HorizontalAlignment="Left" />
                <ComboBox x:Name="State" PlaceholderText="State" Margin="24,24,0,0" RelativePanel.RightOf="City">
                    <!--List of valid states-->
                </ComboBox>
            </RelativePanel>
    </StackPanel>
    <StackPanel x:Name="Associate" Margin="20" RelativePanel.Below="Customer">
        <TextBox x:Name="AssociateName" Header= "Associate" Margin="0,24,0,0" HorizontalAlignment="Left" />
        <DatePicker x:Name="TargetInstallDate" Header="Target install Date" HorizontalAlignment="Left" Margin="0,24,0,0"></DatePicker>
        <TimePicker x:Name="InstallTime" Header="Install Time" HorizontalAlignment="Left" Margin="0,24,0,0"></TimePicker>
    </StackPanel>
    <StackPanel x:Name="Save" Orientation="Horizontal" RelativePanel.Below="Associate">
        <Button Content="Save" Margin="24" />
        <Button Content="Cancel" Margin="24" />
    </StackPanel>
</RelativePanel>

根据需要对控件的更多属性进行自定义,以获得更好的视觉体验。

采用响应式布局

用户可能会在具有不同屏幕宽度的各种设备上查看 UI。 为了确保他们在任意屏幕上都能获得良好的体验,应该采用响应式设计。 请通读该页面,以获得关于设计理念的良好建议并在继续时予以实践。

采用 XAML 的响应式布局页面详细介绍了如何实现这一点。 现在,我们将着重介绍流动布局XAML 中的可视状态

上面给出的基本表单框架就是一个流动布局,因为它主要取决于控件的相对位置,最大限度减少了特定像素大小和位置的使用。 请在日后创建更多 UI 时牢记这一点。

对于响应式布局来说,更重要的是可视状态。可视状态定义了当给定条件为真时应用于给定元素的属性值。 了解如何在 XAML 中进行该操作,然后在表单中实现它们。 下面对我们之前的示例做了更改,实现了一个非常基础的可视状态 :

<Page ...>
    <Grid>
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup>
                <VisualState>
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="640" />
                    </VisualState.StateTriggers>

                    <VisualState.Setters>
                        <Setter Target="Associate.(RelativePanel.RightOf)" Value="Customer"/>
                        <Setter Target="Associate.(RelativePanel.Below)" Value=""/>
                        <Setter Target="Save.(RelativePanel.Below)" Value="Customer"/>
                    </VisualState.Setters>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>

        <RelativePanel>
            <!-- Customer StackPanel -->
            <!-- Associate StackPanel -->
            <!-- Save StackPanel -->
        </RelativePanel>
    </Grid>
</Page>

重要

使用 StateTriggers 时,请始终确保将 VisualStateGroups 附加到根的第一个子级。 在此处,Grid 是根 Page 元素的第一个子元素。

为各种屏幕大小创建可视状态不切实际,而且也不大可能对应用的用户体验产生重大影响。 建议改为对关键断点进行设计 - 有关详细信息,请在此了解更多信息

添加辅助功能支持

设计好能够响应屏幕大小变化的良好布局后,改进用户体验的最后一步是为应用添加辅助功能。 关于这一点,可探讨的内容有很多,但就本例中的表单而言,实现起来非常容易。 重点关注以下内容:

  • 键盘支持 - 确保 UI 面板中元素的顺序与其在屏幕上的显示方式相匹配,以便用户能够轻松地用 TAB 键循环选择它们。
  • 屏幕阅读器支持 - 确保所有控件都具有描述性名称。

在创建包含更多视觉元素的复杂布局时,请查阅辅助功能清单了解详细信息。 虽然辅助功能对应用来说不是必不可少的,但它能帮助应用覆盖和吸引更多受众。

深入探索

虽然本文创建的只是一个表单,但布局和控件的概念适用于你可能构建的所有 XAML UI。 请抽时间浏览本文中提供的链接文档,对已有表单进行试验 - 添加新 UI 功能并进一步改进用户体验。 如果需要更详细布局功能的分步指南,请参阅自适应布局教程

表单也不必存在于真空中,可以更进一步,将它们嵌入到/细节模式NavigationView 中。 或者,如果要对表单背后的代码做些改动,请参阅事件概述

有用的 API 和文档

以下是 API 和其他有用文档的核心简要,可帮助你了解如何处理数据绑定。

有用的 API

API 说明
对表单有用的控件 用于创建表单的有用输入控件的列表,以及在何处使用它们的基本指南。
网格 用于以多行或多列布局安排元素的面板。
RelativePanel 用于相对于其他元素和面板边界安排项目的面板。
StackPanel 用于以单行或单列布局安排元素的面板。
VisualState 用于设置 UI 元素处于特定状态时的外观。

有用的文档

主题 说明
辅助功能概述 对应用中辅助功能选项的宽泛介绍。
辅助功能清单 确保应用符合辅助功能标准的实用清单。
事件概述 有关添加和构造事件以处理 UI 操作的详细信息。
窗体 关于创建表单的总括指南。
布局面板 概述布局面板类型以及在何处使用它们。
列表/细节模式 可以围绕一个或多个表单实现的设计模式。
NavigationView 一种可以包含一个或多个表单的控件。
响应式设计 对响应式设计原则的宽泛介绍。
采用 XAML 的响应式布局 关于响应式设计可视状态及其他实现的特定信息。
面向响应式设计的屏幕大小 关于应将响应式布局限制在哪些屏幕大小范围内的指南。

有用的代码示例

代码示例 说明
客户订单数据库 了解布局和表单在多页企业示例中的应用。
XAML 控件库 了解一些精选的 XAML 控件及其实现方式。
其他代码示例 在类别下拉列表中选择控件、布局和文本,以查看相关代码示例。