当前位置: 首页 > 知识库问答 >
问题:

按enter按钮不会执行带有自动完成文本框的命令

容学林
2023-03-14

我有一个自动完成的文本框,如下所示:

public class AutoCompleteTextBox:ComboBox
{
    public AutoCompleteTextBox()
    {
        ResourceDictionary rd = new ResourceDictionary();
        rd.Source = new Uri("/"+this.GetType().Assembly.GetName().Name+";component/Styles/MainViewStyle.xaml",UriKind.Relative);
        this.Resources = rd;
        this.IsTextSearchEnabled = false;
    }

    /// <summary>
    /// Override OnApplyTemplate method 
    /// Get TextBox control out of Combobox control, and hook up TextChanged event.
    /// </summary>
    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        //get the textbox control in the ComboBox control
        TextBox textBox = this.Template.FindName("PART_EditableTextBox", this) as TextBox;
        if (textBox != null)
        {
            //disable Autoword selection of the TextBox
            textBox.AutoWordSelection = false;
            //handle TextChanged event to dynamically add Combobox items.
            textBox.TextChanged += new TextChangedEventHandler(textBox_TextChanged);                
        }
    }       


    public ObservableCollection<string> SuggestionList
    {
        get { return (ObservableCollection<string>)GetValue(SuggestionListProperty); }
        set { SetValue(SuggestionListProperty, value); }
    }



    public static readonly DependencyProperty SuggestionListProperty = DependencyProperty.Register("SuggestionList", typeof(ObservableCollection<string>), typeof(AutoCompleteTextBox), new UIPropertyMetadata());


    /// <summary>
    /// main logic to generate auto suggestion list.
    /// </summary>
    /// <param name="sender">The source of the event.</param>
    /// <param name="e">The <see cref="System.Windows.Controls.TextChangedEventArgs"/> 
    /// instance containing the event data.</param>
    void textBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox textBox = sender as TextBox;
        textBox.AutoWordSelection = false;
        // if the word in the textbox is selected, then don't change item collection
        if ((textBox.SelectionStart != 0 || textBox.Text.Length == 0))
        {
            this.Items.Clear();
            //add new filtered items according the current TextBox input
            if (!string.IsNullOrEmpty(textBox.Text))
            {
                foreach (string s in this.SuggestionList)
                {
                    if (s.StartsWith(textBox.Text, StringComparison.InvariantCultureIgnoreCase))
                    {

                        string unboldpart = s.Substring(textBox.Text.Length);
                        string boldpart = s.Substring(0, textBox.Text.Length);
                        //construct AutoCompleteEntry and add to the ComboBox
                        AutoCompleteEntry entry = new AutoCompleteEntry(s, boldpart, unboldpart);
                        this.Items.Add(entry);
                    }
                }
            }
        }
        // open or close dropdown of the ComboBox according to whether there are items in the 
        // fitlered result.
        this.IsDropDownOpen = this.HasItems;

        //avoid auto selection
        textBox.Focus();
        textBox.SelectionStart = textBox.Text.Length;

    }
}

/// <summary>
/// Extended ComboBox Item
/// </summary>
public class AutoCompleteEntry : ComboBoxItem
{
    private TextBlock tbEntry;

    //text of the item
    private string text;

    /// <summary>
    /// Contrutor of AutoCompleteEntry class
    /// </summary>
    /// <param name="text">All the Text of the item </param>
    /// <param name="bold">The already entered part of the Text</param>
    /// <param name="unbold">The remained part of the Text</param>
    public AutoCompleteEntry(string text, string bold, string unbold)
    {
        this.text = text;
        tbEntry = new TextBlock();
        //highlight the current input Text
        tbEntry.Inlines.Add(new Run
        {
            Text = bold,
            FontWeight = FontWeights.Bold,
            Foreground = new SolidColorBrush(Colors.RoyalBlue)
        });
        tbEntry.Inlines.Add(new Run { Text = unbold });
        this.Content = tbEntry;
    }

    /// <summary>
    /// Gets the text.
    /// </summary>
    public string Text
    {
        get { return this.text; }
    }
}
<local:AutoCompleteTextBox SuggestionList="{Binding Suggestions}" 
                                           Text="{Binding Path=Keyword,UpdateSourceTrigger=PropertyChanged}"
                                           x:Name="SearchTextBox"/>

当我按回车键时,我想执行搜索命令,但如果屏幕上的建议组合框,按回车键只能关闭建议组合框,我需要再次按回车键来执行命令。有没有一种方法可以关闭建议组合框并执行一次输入按钮的命令?

谢谢

共有1个答案

白越
2023-03-14

可以在处理DropDownClosed事件时调用搜索。

<local:AutoCompleteTextBox SuggestionList="{Binding Suggestions}" 
                                           Text="{Binding Path=Keyword,UpdateSourceTrigger=PropertyChanged}"
                                           DropDownClosed="OnDropDownClosed"
                                           x:Name="SearchTextBox"/>

和ondropdownclosed:

private void OnDropDownClosedobject sender, RoutedPropertyChangedEventArgs<bool> e)
{
    // search on Keyword
}
 类似资料:
  • 由于某些原因,我的多线程netty服务器无法在Windows上使用autocomplete(在我最初的测试中,linux工作得很好),我发现terminal console appender和jansi是很多问题的“解决方案”,除了这个问题。奇怪的是,我的客户机运行相同的代码函数来调用LineReader.ReadLine(“>”);工作完美的自动完成与几乎完全相同的代码。我不知道问题出在哪里,因

  • 如代码所示,fileupload调用一个方法,该方法将文件保存在列表中 谢谢你的帮助。

  • 问题内容: 好吧,我试图通过按Enter提交表单,但不显示提交按钮。我不希望尽可能地使用JavaScript,因为我希望所有功能都可以在所有浏览器上正常工作(我知道的唯一JS方式就是使用事件)。 现在,表单如下所示: 哪个效果很好。当用户按下Enter键时,提交按钮将起作用,并且该按钮在Firefox,IE,Safari,Opera和Chrome中不显示。但是,我仍然不喜欢该解决方案,因为很难知道

  • 我的app里有一些这样的按钮: 我正在尝试创建一个带有文本和图标的按钮。Android:DrawableLeft对我不起作用(也许会,但我不知道如何设置图标的最大高度)。 所以我创建了一个包含ImageView和TextView的LinearLayout,并使其像一个按钮一样运行: 我的新按钮正是我想要的(字体大小,图标和文本放置)。但它看起来不像我的默认按钮: 所以我试着改变新按钮的背景和文本颜

  • 问题内容: 我有一个文本框,我想在其上应用自动完成功能。我正在使用以下插件: 自动压缩 它可以正常工作,但是一旦我将其与AngularJS结合使用,它就会停止工作: 我有以下代码: 和jfiddle的链接如下: 小提琴 如您所见,虽然没有Angular,但自动完成功能不起作用。 有人可以帮忙吗? 问题答案: 为您服务的傻瓜 http://plnkr.co/edit/5XmPfQ78vRjSrxE0

  • 我想创建一个像图片一样的按钮。我是颤动的初学者,所以我不知道如何开始。让我补充一点,我想为按钮添加一个红色发光效果。