代码之家  ›  专栏  ›  技术社区  ›  robintw

WPF中文本中任何位置(而不仅仅是开头)的组合框的自动补全

  •  29
  • robintw  · 技术社区  · 16 年前

    我在WPF中有一个组合框,我用了很多(它有一个自定义模板和一个自定义项模板)。我现在已经把它弄到了几乎按照我想要的方式工作的地步,除了当我在组合框中键入时,它正在为我进行过滤,但只有假设我键入的内容会启动组合框中项目的名称的过滤器。

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

    如果没有,我自己做这件事的最佳方式是什么?是否有某种方法可以获取原始控件,基本上将对StartsWith()的调用更改为对Contains()的呼叫,或者我必须进行更低级的操作?

    5 回复  |  直到 16 年前
        1
  •  8
  •   Aviad P.    15 年前

    组合框现在支持自动补全,只需确保在组合框put的xaml中

    IsEditable="True"
    
        2
  •  39
  •   rreeves    13 年前

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

        3
  •  4
  •   Alan Mendelevich    16 年前

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

        4
  •  4
  •   Mark Carpenter    16 年前

    你可以尝试处理组合框的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
  •  2
  •   amazedsaint    16 年前

    WPF组合框不支持自动补全

    这里有一个示例,通过对项目应用过滤器,您可以间接地做到这一点。

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

    推荐文章