Wpf可编辑组合框:如何通过按enter键将不在列表中的新文本输入到组合框中
本文关键字:组合 新文本 列表 文本 输入 编辑 何通过 Wpf enter | 更新日期: 2023-09-27 18:29:32
问题:我无法在组合框中输入自定义文本并按enter关闭下拉列表,因为我编写的自定义文本被下拉列表中选定的项目覆盖。
我使用可编辑=true和isTextSearchEnabled=true组合框以及字符串列表:
<ComboBox
IsEditable="True"
IsTextSearchEnabled="True"
ItemsSource="{Binding Names}"
SelectedItem="{Binding SelectedName}"
Text="{Binding Name}"
>
<ComboBox.Style>
<Style>
<EventSetter Event="TextBoxBase.TextChanged"
Handler="cmbTextField_TextChanged" />
</Style>
</ComboBox.Style>
</ComboBox>
TextChanged:如果文本已更改,则打开组合框下拉列表
private void cmbTextField_TextChanged(object sender, TextChangedEventArgs e)
{
var cmbx = sender as ComboBox;
//Open the dropdwon
cmbx.IsDropDownOpen = true;
}
如何解决问题:
- 输入第一个字母,例如:"A"。->它打开下拉列表并选择以A开头的第一个名称
- 在找到的名称末尾键入一些额外的字母(以获得不在列表中的新字符串)
- 按下Enter->下拉窗口将关闭,我的自定义文本将被列表中选定的文本覆盖
(但如果我按TAB而不是Enter键,它就可以正常工作)有人知道如何解决这个问题吗?
- 更新:该问题似乎与IsTextSearchEnabled=true属性有关
您可以尝试订阅OnPreviewKeyDown方法,该方法将在按键处理之前激发。当调用该方法时,您可以检查按下的键是否返回,并将其标记为已处理。
应该采取这样的措施:
private void cmbTextField_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) {
if (e.KeyData == Keys.Return) {
e.Handled = true;
}
}
请记住,此代码未经过测试。
我知道这篇文章发布已经很长时间了,但我通过注册到事件来解决它:SelectionChanged并关闭下拉菜单:
private void Combobox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox cb = sender as ComboBox;
cb.IsDropDownOpen = false;
}