【问题标题】:Open AutoCompleteBox in WPF on control focus在 WPF 中打开 AutoCompleteBox 控制焦点
【发布时间】:2013-12-05 22:27:26
【问题描述】:

我正在尝试在控制焦点上打开 System.Windows.Controls.AutoCompleteBox。事件触发但没有任何反应:/当我开始输入一些文本时,自动完成框工作正常。我究竟做错了什么?

AutoCompleteBox box = new AutoCompleteBox();
box.Text = textField.Value ?? "";
box.ItemsSource = textField.Proposals;
box.FilterMode = AutoCompleteFilterMode.Contains;
box.GotFocus += (sender, args) =>
    {
        box.IsDropDownOpen = true;
    };

【问题讨论】:

  • 这里没有多少使用 Silverlight 的经验,但也许值得尝试 box.Dispatcher.BeginInvoke((Action) (() = > { box.IsDropDownOpen = true; }))。我的怀疑是控件在内部对 Focus 事件的处理会妨碍您打开下拉菜单。使用 Dispatcher 队列,您可以在完全处理完 Focus 事件后让下拉列表打开
  • 另一个原因可能是,如果没有项目匹配,AutoCompleteFilterMode.Contains 不允许打开下拉菜单。试试 AutoCompleteFilterMode.None 看看会发生什么...
  • 两个建议都有帮助,但还有一个问题。当盒子里有东西时,一切正常 - 当什么都没有时,下拉菜单根本不会出现:(
  • 你的意思是,即使使用 AutoCompleteFilterMode.None 并且 AutoCompleteBox 的 ItemsSource 包含至少一个元素(又名非空),下拉菜单也不会出现?
  • 您介意发布工作代码 sn-p 作为答案吗(即使您正在回答自己的问题)?了解其他陷入类似问题的人可能会有所帮助...

标签: c# wpf autocomplete


【解决方案1】:

我做了一个快速的解决方法,好像这个解决方案在我的程序中对我来说很满意。

AutoCompleteBox box = new AutoCompleteBox();
box.Text = textField.Value ?? "";
if (textField.Proposals != null)
{
    box.ItemsSource = textField.Proposals;
    box.FilterMode = AutoCompleteFilterMode.None;
    box.GotFocus += (sender, args) =>
        {
            if (string.IsNullOrEmpty(box.Text))
            {
                box.Text = " "; // when empty, we put a space in the box to make the dropdown appear
            }
            box.Dispatcher.BeginInvoke(() => box.IsDropDownOpen = true);
        };
    box.LostFocus += (sender, args) =>
        {
            box.Text = box.Text.Trim();
        };
    box.TextChanged += (sender, args) =>
        {
            if (!string.IsNullOrWhiteSpace(box.Text) &&
                box.FilterMode != AutoCompleteFilterMode.Contains)
            {
                box.FilterMode = AutoCompleteFilterMode.Contains;
            }

            if (string.IsNullOrWhiteSpace(box.Text) &&
                box.FilterMode != AutoCompleteFilterMode.None)
            {
                box.FilterMode = AutoCompleteFilterMode.None;
            }
        };
}

【讨论】:

    【解决方案2】:

    @elgonzo 推荐的解决方案非常适合我。

    XAML:

    <wpftk:AutoCompleteBox FilterMode="Contains"
                           ItemsSource="{Binding List}"
                           MinimumPrefixLength="0"
                           Text="{Binding Text}"
                           GotFocus="AutoCompleteBox_GotFocus"/>
    

    带有命名空间

    xmlns:wpftk="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Input.Toolkit"
    

    和代码隐藏:

    private void AutoCompleteBox_GotFocus(object sender, System.Windows.RoutedEventArgs e)
    {
        var _acb = sender as AutoCompleteBox;
        if(_acb != null && string.IsNullOrEmpty(_acb.Text))
        {
            _acb.Dispatcher.BeginInvoke((Action)(() => { _acb.IsDropDownOpen = true; }));
        }
    }
    

    当尚未输入文本且 AutoCompleteBox 获得焦点时,将出现下拉菜单。

    【讨论】:

      猜你喜欢
      • 2011-05-25
      • 2012-10-22
      • 2010-11-04
      • 2014-02-09
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      相关资源
      最近更新 更多