表单

表单是一组从用户收集和提交数据的控件。 表单通常用于设置页面、调查、创建帐户等。

本文讨论为表单创建 XAML 布局的设计准则。

窗体示例

何时应使用表单?

表单是用于收集彼此明显相关的数据输入的专用页面。 需要从用户显式收集数据时,应使用表单。 你可以为用户创建表单以:

  • 登录到帐户
  • 注册帐户
  • 更改应用设置,例如隐私或显示选项
  • 参与调查
  • 购买商品
  • 提供反馈

表单类型

在考虑如何提交和显示用户输入时,有两种类型的表单:

1. 即时更新

设置页面

如果希望用户立即看到更改窗体中值的结果,请使用即时更新窗体。 例如,在设置页面中,将显示当前所选内容,并立即应用对所选内容所做的任何更改。 若要确认应用中的更改,需要向每个输入控件 添加事件处理程序 。 如果用户更改了输入控件,则你的应用可以做出适当的响应。

2. 使用按钮提交

其他类型的表单允许用户选择何时通过单击按钮提交数据。

日历添加新事件页

这种类型的表单为用户提供响应的灵活性。 通常,这种类型的表单包含更多自由形式的输入字段,从而接收更多响应。 为确保提交时有效的用户输入和格式正确的数据,请考虑以下建议:

  • 通过使用正确的控件(例如,使用 CalendarDatePicker 而不是 TextBox)来防止提交无效信息。 请参见在下文的“输入控件”部分中选择窗体中适当输入控件的更多信息。
  • 使用 TextBox 控件时,向用户提供 包含 PlaceholderText 属性的所需输入格式的提示。
  • 向用户提供相应的屏幕键盘,方法是使用 InputScope 属性声明控件的预期输入。
  • 请在标签中用星号 * 标记必填输入字段。
  • 禁用提交按钮,直到填写所有必需的信息。
  • 如果提交时数据无效,请使用突出显示的字段或边框标记输入无效的控件,并要求用户重新提交表单。
  • 对于其他错误(例如网络连接失败),请确保向用户显示适当的错误消息。

版式

为了方便用户体验并确保用户能够输入正确的输入,请考虑以下用于设计表单布局的建议。

标签

标签 应左对齐,并放置在输入控件上方。 许多控件都有一个内置的 Header 属性来显示标签。 对于没有 Header 属性或标记控件组的控件,可以改用 TextBlock

若要 设计辅助功能,请标记所有单独控件和控件组,以便为用户和屏幕阅读器提供清晰性。

对于字体样式,请使用默认 的 Windows 类型渐变。 用于 TitleTextBlockStyle 页面标题、 SubtitleTextBlockStyle 组标题和 BodyTextBlockStyle 控件标签。

务必不要
带有顶部标签的窗体 带左标签的窗体不会执行指定操作

Spacing

若要以视觉方式将控件组彼此分开,请使用 对齐、边距和填充。 单个输入控件的高度为 80px,应分隔 24px。 输入控件组应分隔 48px。

窗体组

创建列可以减少窗体中不必要的空白,尤其是屏幕大小较大时。 但是,如果要创建多列窗体,列数应取决于页面上的输入控件数和应用窗口的屏幕大小。 请考虑为表单创建多个页面,以避免使用过多的输入控件使屏幕杂乱。

务必不要
包含 2 列的窗体 包含 2 个有缺陷的列的表单
包含 3 列的窗体

响应性强的布局

窗体应随着屏幕或窗口大小的变化而调整大小,因此用户不会忽略任何输入字段。 有关详细信息,请参阅 响应式设计技术。 例如,无论屏幕大小如何,你可能都希望窗体的特定区域始终可以被看到。

窗体焦点

制表位

用户可以使用键盘通过 Tab 键停留点来导航控件。 默认情况下,控件的 Tab 键顺序反映它们在 XAML 中创建的顺序。 若要替代默认行为,请更改控件的 IsTabStopTabIndex 属性。

窗体中的控件上的选项卡焦点

输入控件

输入控件是允许用户将信息输入表单的 UI 元素。 下面列出了可添加到窗体的一些常见控件,以及有关何时使用这些控件的信息。

文本输入

控件 Use Example
文本框 捕捉一行或多行的文本 名称、自由形式响应或反馈
密码框 通过隐藏字符来收集私有数据 密码、社会保障号码(SSN)、PIN、信用卡信息
自动建议框 在用户键入时,向用户显示来自相应数据集的建议列表 数据库搜索,邮件到:行,以前的查询
富文本编辑框 使用格式化文本、超链接和图像编辑文本文件 在应用中上传文件、预览和编辑

选择

控件 Use Example
CheckBox 选择或取消选择一个或多个操作项 同意条款和条件,添加可选项目,选择所有适用项
RadioButton 从两个或多个选项中选择一个选项 选择类型、运输方式等。
ToggleSwitch 选择两个互斥选项之一 开/关

注意:如果有五个或更多选择项,请使用列表控件。

Lists

控件 Use Example
ComboBox 从精简状态开始并展开以显示可选择项目列表 从长列表中进行选择,例如州或国家/地区
ListView 对项目进行分类并分配组标题、拖放项目、整理内容和重新排序项目 排名选项
GridView 排列和浏览基于图像的集合 选取照片、颜色、显示主题

数值输入

控件 Use Example
滑块 从连续数值范围中选择一个数字 百分比、音量、播放速度
评级 给出星级评分 客户反馈

日期和时间

控件 Use
CalendarView 从始终可见的日历中选择单个日期或日期范围
CalendarDatePicker 从上下文日历中选择单个日期
DatePicker 当上下文信息不重要时,选择一个本地化的日期
TimePicker 选取单个时间值

附加控件

有关 UWP 控件的完整列表,请参阅 按函数列出的控件索引

有关更复杂的自定义 UI 控件,请查看 TelerikSyncFusionDevExpressInfragisticsComponentOneActiPro 等公司提供的资源。

一列表单示例

此示例使用 Acrylic 列表/详细信息列表视图NavigationView 控件。 另一个窗体示例的屏幕截图

<StackPanel>
    <TextBlock Text="New Customer" Style="{StaticResource TitleTextBlockStyle}"/>
    <Button Height="100" Width="100" Background="LightGray" Content="Add photo" Margin="0,24" Click="AddPhotoButton_Click"/>
    <TextBox x:Name="Name" Header= "Name" Margin="0,24,0,0" MaxLength="32" Width="400" HorizontalAlignment="Left" InputScope="PersonalFullName"/>
    <TextBox x:Name="PhoneNumber" Header="Phone Number" Margin="0,24,0,0" MaxLength="15" Width="400" HorizontalAlignment="Left" InputScope="TelephoneNumber" />
    <TextBox x:Name="Email" Header="Email" Margin="0,24,0,0" MaxLength="50" Width="400" HorizontalAlignment="Left" InputScope="EmailNameOrAddress" />
    <TextBox x:Name="Address" Header="Address" PlaceholderText="Address" Margin="0,24,0,0" MaxLength="50" Width="400" HorizontalAlignment="Left" InputScope="EmailNameOrAddress" />
    <TextBox x:Name="Address2" Margin="0,24,0,0" PlaceholderText="Address 2" MaxLength="50" Width="400" HorizontalAlignment="Left" InputScope="EmailNameOrAddress" />
    <RelativePanel>
        <TextBox x:Name="City" PlaceholderText="City" Margin="0,24,0,0" MaxLength="50" Width="200" HorizontalAlignment="Left" InputScope="EmailNameOrAddress" />
        <ComboBox x:Name="State" PlaceholderText="State" Margin="24,24,0,0"  Width="100" RelativePanel.RightOf="City">
             <x:String>WA</x:String>
        </ComboBox>
    </RelativePanel>
    <TextBox x:Name="ZipCode" PlaceholderText="Zip Code" Margin="0,24,0,0" MaxLength="6" Width="100" HorizontalAlignment="Left" InputScope="Number" />
    <StackPanel Orientation="Horizontal">
        <Button Content="Save" Margin="0,24" Click="SaveButton_Click"/>
        <Button Content="Cancel" Margin="24" Click="CancelButton_Click"/>
    </StackPanel>  
</StackPanel>

两列表单示例

此示例除了输入控件外,还使用 Pivot 控件、 亚克力 背景和 CommandBar窗体示例的屏幕截图

<Grid>
    <Pivot Background="{ThemeResource SystemControlAccentAcrylicWindowAccentMediumHighBrush}" >
        <Pivot.TitleTemplate>
            <DataTemplate>
                <Grid>
                    <TextBlock Text="Company Name" Style="{ThemeResource HeaderTextBlockStyle}"/>
                </Grid>
            </DataTemplate>
        </Pivot.TitleTemplate>
        <PivotItem Header="Orders" Margin="0"/>    
        <PivotItem Header="Customers" Margin="0">
            <!--Form Example-->
            <Grid Background="White">
                <RelativePanel>
                    <StackPanel x:Name="Customer" Margin="20">
                        <TextBox x:Name="CustomerName" Header= "Customer Name" Margin="0,24,0,0" MaxLength="320" Width="400" HorizontalAlignment="Left" InputScope="PersonalFullName"/>
                        <TextBox x:Name="CustomerPhoneNumber" Header="Phone Number" Margin="0,24,0,0" MaxLength="50" Width="400" HorizontalAlignment="Left" InputScope="TelephoneNumber" />
                        <TextBox x:Name="Address" Header="Address" PlaceholderText="Address" Margin="0,24,0,0" MaxLength="50" Width="400" HorizontalAlignment="Left" InputScope="AlphanumericFullWidth" />
                        <TextBox x:Name="Address2" Margin="0,24,0,0" PlaceholderText="Address 2" MaxLength="50" Width="400" HorizontalAlignment="Left" InputScope="AlphanumericFullWidth" />
                        <RelativePanel>
                            <TextBox x:Name="City" PlaceholderText="City" Margin="0,24,0,0" MaxLength="50" Width="200" HorizontalAlignment="Left" InputScope="Text" />
                            <ComboBox x:Name="State" PlaceholderText="State" Margin="24,24,0,0"  Width="100" RelativePanel.RightOf="City">
                                <x:String>WA</x:String>
                            </ComboBox>
                        </RelativePanel>
                        <TextBox x:Name="ZipCode" PlaceholderText="Zip Code" Margin="0,24,0,0" MaxLength="6" Width="100" HorizontalAlignment="Left" InputScope="Number" />
                    </StackPanel>
                    <StackPanel x:Name="Associate" Margin="20" RelativePanel.RightOf="Customer">
                        <TextBox x:Name="AssociateName" Header= "Associate" Margin="0,24,0,0" MaxLength="320" Width="400" HorizontalAlignment="Left" InputScope="PersonalFullName"/>
                        <TextBox x:Name="AssociatePhoneNumber" Header="Phone Number" Margin="0,24,0,0" MaxLength="50" Width="400" HorizontalAlignment="Left" InputScope="TelephoneNumber" />
                        <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>
                </RelativePanel>
            </Grid>
        </PivotItem>
        <PivotItem Header="Invoices"/>
        <PivotItem Header="Stock"/>
        <Pivot.RightHeader>
            <CommandBar OverflowButtonVisibility="Collapsed" Background="Transparent">
                <AppBarButton Icon="Add"/>
                <AppBarSeparator/>
                <AppBarButton Icon="Edit" />
                <AppBarButton Icon="Delete"/>
                <AppBarSeparator/>
                <AppBarButton Icon="Save"/>
            </CommandBar>
        </Pivot.RightHeader>
    </Pivot>
</Grid>

客户订单数据库示例

客户订单数据库屏幕截图 若要了解如何将表单输入连接到 Azure 数据库并查看完全实现的表单,请参阅 “客户订单数据库” 应用示例。