WPF组合框在第一个字母输入时自动突出显示
本文关键字:显示 输入 组合 第一个 WPF | 更新日期: 2023-09-27 18:19:34
嗨,我在WPF 中有一个ComboBox
<ComboBox x:Name="Select_Food" Grid.ColumnSpan="3" Margin="10" Text="" IsEditable="True"
ItemsSource="{Binding}" KeyUp="Select_Food_KeyUp" IsTextSearchEnabled="false" />
当用户在文本框中键入时,我从数据库中获取信息作为选项。目前一切正常,但唯一的问题是,当我在文本框中键入第一个字母时,如果列表中的任何项目都以该字母开头,则该字母会自动突出显示。因此,任何进一步的输入都会覆盖第一个字母。这是个问题。如何停止此初始高亮显示。我正在尝试实现一个"类似谷歌搜索"的组合框。
这是代码。请帮忙。
// While typing this function is called on every keyup stroke
private void Select_Food_KeyUp(object sender, KeyEventArgs e)
{
try
{
SqlCeCommand command = new SqlCeCommand("SELECT FOODITEM_RS FROM FOOD WHERE FOODITEM_RS LIKE @fitem", thisConnection);
command.Parameters.AddWithValue("@fitem", "%" + Select_Food.Text + "%");
SqlCeDataAdapter da = new SqlCeDataAdapter(command);
DataSet ds = new DataSet();
thisConnection.Open();
da.Fill(ds, "FOOD");
Select_Food.ItemsSource = ds.Tables[0].DefaultView;
Select_Food.DisplayMemberPath = ds.Tables[0].Columns["FOODITEM_RS"].ToString();
}
catch (SqlCeException x)
{
MessageBox.Show(x.ToString());
}
//Open dropdown menu
Select_Food.IsDropDownOpen = true;
thisConnection.Close();
}
这就是我修复它的方法-
在我的keyup事件处理程序中,我添加了以下代码-
var textbox = (TextBox)cmbBox.Template.FindName("PART_EditableTextBox", cmbBox);
if (textbox != null && _firstKey && textbox.SelectionLength > 0)
{
textbox.Select(textbox.SelectionLength, 0);
_firstKey = false;
}
_firstKey是我添加的标志。这样,只有在第一次引发此事件时,突出显示才会被取消,这就是问题所在。随后的突出显示(很可能是由用户清除他们键入的内容)是允许的,并且保持不变。
我从SelectionLength开始调用Select,这样我的光标将保持在用户输入的文本的末尾。我传递的长度为0以清除选择。
尽管这很古老,Darlene的回答帮助了我。然而,我进行了以下编辑:
代替:
textbox.Select(textbox.SelectionLength, 0);
我用过:
textbox.Select(1, textbox.SelectionLength);
也许是更新的组合框功能,但第一个匹配项目的整个文本都会输入到文本框中。因此,将光标放在输入文本的末尾不允许用户继续键入。此更改使非用户输入的文本保持高亮显示,并在用户键入时替换其他字符。直到他们键入列表中没有的内容,然后离开。
我们通过将IsDropDownOpen = true
移动到preKeyDown
事件来解决此问题。这是因为每当DropDown打开时,组合框的行为都会选择文本
最近我在WPF中实现自定义组合框时偶然发现了这种行为。以前的技巧/解决方案都不适用于我。如果用户键入的速度真的很快,同样的行为仍然会发生,并且第一个字符会从文本框中删除。我应用的解决方案只是覆盖事件OnDropDownOpened,并将选择的技巧放在该事件中。
protected override void OnDropDownOpened(EventArgs e)
{
var textBox = Keyboard.FocusedElement as TextBox;
if (textBox != null && textBox.Text.Length == 1 && textBox.SelectionLength == 1)
{
textBox.SelectionLength = 0;
textBox.SelectionStart = 1;
}
}