private void ColorComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
string colorName = e.AddedItems[0].ToString();
Color color;
switch (colorName)
case "Yellow":
color = Colors.Yellow;
break;
case "Green":
color = Colors.Green;
break;
case "Blue":
color = Colors.Blue;
break;
case "Red":
color = Colors.Red;
break;
colorRectangle.Fill = new SolidColorBrush(color);
SelectionChanged 和键盘导航
默认情况下,当用户单击、点击列表中的项或对其按 Enter 以提交所做的选择时,就会发生 SelectionChanged 事件,然后组合框会关闭。 当用户使用键盘箭头键导航打开的组合框列表时,不会改变所做的选择。
若要创建可在用户使用箭头键导航打开的列表时实时更新的组合框(如字体选择下拉列表),请将 SelectionChangedTrigger 设置为 Always。 这样,当焦点转到开放列表中的另一项时,就会发生 SelectionChanged 事件。
所选项行为变化
在 Windows 10 版本 1809 (SDK 17763) 或更高版本中,选定项的行为已更新,支持可编辑的组合框。
在 SDK 17763 之前,SelectedItem 属性(以及相应的 SelectedValue 和 SelectedIndex)的值必须位于组合框的项集中。 使用上一示例时,设置 colorComboBox.SelectedItem = "Pink"
会导致:
SelectedItem = null
SelectedValue = null
SelectedIndex = -1
在 SDK 17763 及更高版本中,SelectedItem 属性(以及相应的 SelectedValue 和 SelectedIndex)的值不需位于组合框的项集中。 使用上一示例时,设置 colorComboBox.SelectedItem = "Pink"
会导致:
SelectedItem = Pink
SelectedValue = Pink
SelectedIndex = -1
组合框自动支持其集合内的搜索。 当焦点位于打开或关闭的组合框上时,如果用户在物理键盘上键入字符,与用户的字符串匹配的候选项将引入视图。 当在长列表中导航时,此功能尤其有用。 例如,当与包含状态列表的下拉列表交互时,用户可以按“w”键来将“Washington”引入视图,以供快速选择。 文本搜索不区分大小写。
可以将 IsTextSearchEnabled 属性设置为 false 以禁用此功能。
使组合框变得可编辑
此功能需要 Windows 10 版本 1809 (SDK 17763) 或更高版本。
默认情况下,组合框允许用户从预定义的选项列表中进行选择。 但有时候,列表仅包含一部分有效值,因此应该允许用户输入未列出的其他值。 为了支持该功能,可以让组合框变得可编辑。
若要让组合框变得可编辑,请将 IsEditable 属性设置为 true。 然后处理 TextSubmitted 事件,以便处理用户输入的值。
默认情况下,当用户提交自定义文本时,SelectedItem 值就会更新。 可以在 TextSubmitted 事件参数中将 Handled 设置为 true,以便覆盖此行为。 将事件标记为“已处理”后,组合框就不会在事件之后执行进一步的操作,会停留在“正在编辑”状态。 SelectedItem 将不会更新。
此示例显示了一个简单的可编辑组合框。 此列表包含简单的字符串,用户输入的任何值都会用作已输入值。
“最近使用的名称”选择器允许用户输入自定义字符串。 “RecentlyUsedNames”列表包含可供用户选择的一些值,但用户也可添加新的自定义值。 “CurrentName”属性表示当前输入的名称。
<ComboBox IsEditable="true"
ItemsSource="{x:Bind RecentlyUsedNames}"
SelectedItem="{x:Bind CurrentName, Mode=TwoWay}"/>
提交的文本
可以处理 TextSubmitted 事件,以便处理用户输入的值。 在事件处理程序中,通常需验证用户输入的值是否有效,然后即可在应用中使用该值。 也可根据情况将值添加到组合框的选项列表中供将来使用。
当以下条件满足时,会发生 TextSubmitted 事件:
IsEditable 属性为 true
用户输入的文本与组合框列表中的现有条目不匹配
用户按了 Enter,或已将焦点从组合框中移开。
如果用户在输入文本后又通过列表进行上下导航,则不会发生 TextSubmitted 事件。
在此示例中,字体大小选择器包含与字体大小渐变相对应的一组值,但用户可输入不在列表中的字体大小。
当用户添加不在列表中的值时,字体大小会更新,但值不会添加到字体大小列表中。
如果新输入的值无效,则请使用 SelectedValue 将 Text 属性还原为上一个已知有效的值。
<ComboBox x:Name="fontSizeComboBox"
IsEditable="true"
ItemsSource="{x:Bind ListOfFontSizes}"
TextSubmitted="FontSizeComboBox_TextSubmitted"/>
private void FontSizeComboBox_TextSubmitted(ComboBox sender, ComboBoxTextSubmittedEventArgs e)
if (byte.TryParse(e.Text, out double newValue))
// Update the app's font size.
_fontSize = newValue;
// If the item is invalid, reject it and revert the text.
// Mark the event as handled so the framework doesn't update the selected item.
sender.Text = sender.SelectedValue.ToString();
e.Handled = true;
在这里,“最喜爱颜色选择器”包含通常情况下人们最喜爱的颜色(红、蓝、绿、橙),但用户可以输入不在列表中的最喜爱的颜色。 当用户添加有效颜色(例如粉红色)时,新输入的颜色会添加到列表中,并被设置为有效的“最喜爱颜色”。
<ComboBox x:Name="favoriteColorComboBox"
IsEditable="true"
ItemsSource="{x:Bind ListOfColors}"
TextSubmitted="FavoriteColorComboBox_TextSubmitted"/>
private void FavoriteColorComboBox_TextSubmitted(ComboBox sender, ComboBoxTextSubmittedEventArgs e)
if (IsValid(e.Text))
FavoriteColor newColor = new FavoriteColor()
ColorName = e.Text,
Color = ColorFromStringConverter(e.Text)
ListOfColors.Add(newColor);
// If the item is invalid, reject it but do not revert the text.
// Mark the event as handled so the framework doesn't update the selected item.
e.Handled = true;
bool IsValid(string Text)
// Validate that the string is: not empty; a color.
获取示例代码
WinUI 库示例 - 以交互式格式查看所有 XAML 控件。
拼写检查指南
TextBox 类
PasswordBox 类
String.Length 属性