private void SearchBox_KeyUp(object sender, KeyEventArgs e)
{
SearchBox.IsDropDownOpen = true;
if (e.Key == Key.Down || e.Key == Key.Up)
{
e.Handled = true;
//if trying to navigate but there's noting selected, then select one
if(SearchBox.Items.Count > 0 && SearchBox.SelectedIndex == -1)
{
SearchBox.SelectedIndex = 0;
}
}
else if (e.Key == Key.Enter)
{
//commit to selection
}
else if (string.IsNullOrWhiteSpace(SearchBox.Text))
{
SearchBox.Items.Clear();
SearchBox.IsDropDownOpen = false;
SearchBox.SelectedIndex = -1;
}
else if (SearchBox.Text.Length > 1)
{
//if something is currently selected, then changing the selected index later will loose
//focus on textbox part of combobox and cause the text to
//highlight in the middle of typing. this will "eat" the first letter or two of the user's search
if(SearchBox.SelectedIndex != -1)
{
TextBox textBox = (TextBox)((ComboBox)sender).Template.FindName("PART_EditableTextBox", (ComboBox)sender);
//backup what the user was typing
string temp = SearchBox.Text;
//set the selected index to nothing. sets focus to dropdown
SearchBox.SelectedIndex = -1;
//restore the text. sets focus and highlights the combobox text
SearchBox.Text = temp;
//set the selection to the end (remove selection)
textBox.SelectionStart = ((ComboBox)sender).Text.Length;
textBox.SelectionLength = 0;
}
//your search logic
}
}
private void SearchBox_DropDownOpened(object sender, EventArgs e)
{
TextBox textBox = (TextBox)((ComboBox)sender).Template.FindName("PART_EditableTextBox", (ComboBox)sender);
textBox.SelectionStart = ((ComboBox)sender).Text.Length;
textBox.SelectionLength = 0;
}
7条答案
按热度按时间ryevplcw1#
我也遇到了同样的问题,和一些刚接触WPF的用户一样,我也很难让Einar Guðsteinsson给出的解决方案发挥作用。因此,为了支持他的回答,我在这里粘贴了让这个解决方案发挥作用的步骤。(或者更准确地说,我是如何让这个解决方案发挥作用的)。
首先创建一个从Combobox类继承的自定义Combobox类。有关完整实现,请参见下面的代码。您可以在OnDropSelectionChanged中更改代码以满足您的个人要求。
命名空间MyCustomComboBoxApp {使用系统.窗口.控件;
请确保此自定义组合类存在于同一项目中。然后,您可以使用下面的代码在UI中引用此组合。
就是这样!有什么问题,尽管问吧!我会尽力帮忙的。
感谢Einar Guðsteinsson的解决方案!
k2fxgqgv2#
迟做总比不做好,如果有人碰到这个问题,他可能会用这个。
如果你重写组合框,就可以做到这一点。首先获取模板中使用的文本框的句柄,并注册到selectionchanged事件。
然后在事件处理程序中,您可以再次设置选择。在我的例子中,我在代码中调用了IsDropDownOpen。将选择保存在那里,然后将其放回事件处理程序中。虽然很难看,但还是成功了。
o2gm4chl3#
对于clsturgeon的回答,我通过设置DropDownOpened事件发生时的选择来解决这个问题:
eyh26e7m4#
我认为在Andrew N提供的解决方案中缺少了一些东西,因为当我尝试它时,TextBox的Selection Changed事件将插入符号放在了错误的位置。所以我做了这个更改来解决这个问题。
eoigrqb65#
当一个组合框获得焦点时,你可以禁用文本突出显示(即在GotFocus事件中不选择任何文本)。然而,当你下拉组合框时,系统会在列表中找到该项目并将其作为选定项目。这反过来会自动突出显示文本。如果我理解你所寻找的行为,我不相信这是完全可能的。
krcsximq6#
我可以使用Jun Xie提供的修改后的答案来修复它。假设您使用
keyUp
事件进行组合框搜索,我在我的自定义用例中发现了一个边缘用例,它仍然会覆盖文本:解决方法是检查是否选择了某个项目。下面是工作代码:XAML文件:
编码:
7xzttuei7#
另一种选择。防止框架扰乱选择。