WPF中控件获得焦点时如何打开AutoCompleteBox

3

我正在尝试在控件焦点上打开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;
    };

2
这里没有太多关于Silverlight的经验,但或许值得尝试一下 box.Dispatcher.BeginInvoke((Action) (() = > { box.IsDropDownOpen = true; }))。我猜测控件内部对焦点事件的处理会妨碍你打开下拉菜单。使用Dispatcher队列,你可以在焦点事件完全处理完之后再打开下拉菜单。 - user2819245
另一个可能的原因是,如果没有匹配项,AutoCompleteFilterMode.Contains 不允许下拉列表打开。尝试使用 AutoCompleteFilterMode.None 看看会发生什么... - user2819245
两个提议都有所帮助,但还存在一个问题。当文本框中有内容时,一切正常 - 但是当没有内容时,下拉菜单根本不会出现:( - Nickon
你的意思是,即使使用了AutoCompleteFilterMode.None并且AutoCompleteBox的ItemsSource包含至少一个元素(也就是非空),下拉框仍然没有出现? - user2819245
1
你介意把可行的代码片段作为答案发布吗(即使你是在回答自己的问题)?这可能对其他陷入类似问题的人有所帮助... - user2819245
显示剩余4条评论
2个回答

6

我在我的程序中找到了一个快速的解决方法,如果这个解决方案对我满意。

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;
            }
        };
}

1
推荐的解决方案来自@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; }));
    }
}

下拉菜单会在还没有输入文本并且自动完成框获得焦点时出现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接