【问题标题】:Autocomplete for ComboBox in WPF anywhere in text (not just beginning)文本中任意位置的 WPF 中 ComboBox 的自动完成(不仅仅是开始)
【发布时间】:2009-02-06 22:34:13
【问题描述】:

我在 WPF 中有一个 ComboBox,我用过很多次(它有一个自定义模板和一个自定义项模板)。我现在已经达到了它几乎可以按照我想要的方式工作的地步,除了当我在 ComboBox 中键入时,它正在为我进行过滤,但仅在假设我键入的内容开始时进行过滤组合框。

例如,如果我在组合框中有一个名为“Windows Media Player”的项目,它只会在我开始输入“Windows Media...”时找到它,而如果我开始输入“Media Play. ……”。有没有办法解决?我可以在某处设置一个属性来告诉它在整个字符串中搜索,而不仅仅是使用 StartsWith()?

如果不是,最好的方法是让我自己做这件事?有什么方法可以获取原始控制权,基本上只是将对 StartsWith() 的调用更改为对 Contains() 的调用,还是我必须更底层?

【问题讨论】:

    标签: c# .net wpf combobox


    【解决方案1】:

    组合框现在支持自动完成,只需确保在 xaml 中放置组合框

    IsEditable="True"
    

    【讨论】:

    • 不幸的是,它允许用户输入无效数据,您必须添加更多逻辑/事件处理。
    【解决方案2】:

    查看 CodeProject 中的以下文章: A Reusable WPF Autocomplete TextBox

    【讨论】:

      【解决方案3】:

      据我所知,仅通过更改设置无法强制标准 ComboBox 以这种方式运行。因此,您必须为此实现自己的组合框衍生工具,或者搜索现成的 3rd 方控件(我相信有很多)。

      【讨论】:

        【解决方案4】:

        您可以尝试处理 ComboBox 的 TextInput 或 PreviewTextInput 事件,自己进行文本搜索,选择最合适的项目,并设置“e.Handled = true”。只是一个想法。希望这会有所帮助!

        编辑:

        这适用于单个字符(即,如果您输入字母“j”,它将选择包含“j”或“J”的第一个项目),但我确信有一种方法可以做到这一点你的控制。尽情享受吧!

        private void MyComboBox_PreviewTextInput(object sender, TextCompositionEventArgs e) {
            foreach (ComboBoxItem i in MyComboBox.Items) {
                if (i.Content.ToString().ToUpper().Contains(e.Text.ToUpper())) {
                    MyComboBox.SelectedItem = i;
                    break;
                }
            }
            e.Handled = true;
        }
        

        【讨论】:

          【解决方案5】:

          WPF 组合框不支持自动完成

          这里有一个示例,您可以通过对项目应用过滤器以间接方式执行此操作。

          http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/cec1b222-2849-4a54-bcf2-03041efcf304/

          【讨论】:

          • 此链接上的代码似乎不再有效,并且作者说他太忙了,无法修复它。
          • 实际上,不可编辑的组合框将在控件获得焦点时根据击键自动选择列表中的项目。我很确定这就是他们所说的。如果说您有一个州列表,则在 ComboBox 上按 Tab 键并按 F 将选择佛罗里达州。除非您定义了我发现的自定义项目模板,否则会破坏这种“自动完成”行为。
          猜你喜欢
          • 1970-01-01
          • 2012-08-30
          • 1970-01-01
          • 2021-07-02
          • 2010-10-31
          • 1970-01-01
          • 2015-10-27
          • 1970-01-01
          • 2016-03-31
          相关资源
          最近更新 更多