【问题标题】:WPF combobox auto highlighting on first letter inputWPF 组合框在首字母输入时自动突出显示
【发布时间】:2013-06-19 11:52:03
【问题描述】:

您好,我在 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();

    }

【问题讨论】:

  • 你有没有想过如何解决这个问题?我遇到了同样的问题 - 我第一次在组合框中输入第一个字母时突出显示,然后被我输入的第二个字母覆盖。

标签: c# .net combobox highlighting


【解决方案1】:

这就是我修复它的方法-

在我的 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来清除选择。

【讨论】:

    【解决方案2】:

    尽管如此,达琳的回答对我有所帮助。但是,我进行了以下编辑:

    代替:

    textbox.Select(textbox.SelectionLength, 0);
    

    我用过:

    textbox.Select(1, textbox.SelectionLength);
    

    也许它是较新的 ComboBox 功能,但第一个匹配项的整个文本都输入到文本框中。因此,将光标放在输入文本的末尾不允许用户继续输入。此更改使非用户输入的文本突出显示,并在用户键入时替换其他字符。直到他们输入不在列表中的内容然后消失。

    【讨论】:

      【解决方案3】:

      我们通过将IsDropDownOpen = true 移动到preKeyDown 事件来解决此问题。 这是因为无论何时打开 DropDown,都会选择组合框的行为

      【讨论】:

        【解决方案4】:

        最近我在 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;
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2010-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-13
          • 1970-01-01
          • 1970-01-01
          • 2012-07-24
          相关资源
          最近更新 更多