AutoComplete TextBox in WPF

后端 未结 8 1407
忘了有多久
忘了有多久 2020-11-27 11:17

Is it possible to make a textbox autocomplete in WPF?

I found a sample where a combo box is used and the triangle is removed by editing the style template.

相关标签:
8条回答
  • 2020-11-27 11:26

    I'm surprised why no one suggested to use the WinForms Textbox.

    XAML:

         <WindowsFormsHost  Margin="10" Width="70">
            <wf:TextBox x:Name="textbox1"/>
         </WindowsFormsHost>
    

    Also don't forget the Winforms Namespace:

    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
    

    C#:

         AutoCompleteStringCollection stringCollection = new AutoCompleteStringCollection(){"String 1", "String 2", "etc..."};
       
         textbox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
         textbox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
         textbox1.AutoCompleteCustomSource = stringCollection;
    

    With Autocomplete, you need to do it in the Code behind, because for some reasons, others might can explain, it throws an exception.

    0 讨论(0)
  • 2020-11-27 11:27

    and here the fork of the toolkit wich contains the port to 4.O,

    https://github.com/jogibear9988/wpftoolkit

    it's worked very well to me .

    0 讨论(0)
  • 2020-11-27 11:30

    or you can add the AutoCompleteBox into the toolbox by clicking on it and then Choose Items, go to WPF Components, type in the filter AutoCompleteBox, which is on the System.Windows.Controls namespace and the just drag into your xaml file. This is way much easier than doing these other stuff, since the AutoCompleteBox is a native control.

    0 讨论(0)
  • 2020-11-27 11:35

    If you have a small number of values to auto complete, you can simply add them in xaml. Typing will invoke auto-complete, plus you have dropdowns too.

    <ComboBox Text="{Binding CheckSeconds, UpdateSourceTrigger=PropertyChanged}"
              IsEditable="True">
        <ComboBoxItem Content="60"/>
        <ComboBoxItem Content="120"/>
        <ComboBoxItem Content="180"/>
        <ComboBoxItem Content="300"/>
        <ComboBoxItem Content="900"/>
    </ComboBox>
    
    0 讨论(0)
  • 2020-11-27 11:38

    I know this is a very old question but I want to add an answer I have come up with.

    First you need a handler for your normal TextChanged event handler for the TextBox:

    private bool InProg;
    internal void TBTextChanged(object sender, TextChangedEventArgs e)
                {
                var change = e.Changes.FirstOrDefault();
                if ( !InProg )
                    {
                    InProg = true;
                    var culture = new CultureInfo(CultureInfo.CurrentCulture.Name);
                    var source = ( (TextBox)sender );
                        if ( ( ( change.AddedLength - change.RemovedLength ) > 0 || source.Text.Length > 0 ) && !DelKeyPressed )
                            {
                             if ( Files.Where(x => x.IndexOf(source.Text, StringComparison.CurrentCultureIgnoreCase) == 0 ).Count() > 0 )
                                {
                                var _appendtxt = Files.FirstOrDefault(ap => ( culture.CompareInfo.IndexOf(ap, source.Text, CompareOptions.IgnoreCase) == 0 ));
                                _appendtxt = _appendtxt.Remove(0, change.Offset + 1);
                                source.Text += _appendtxt;
                                source.SelectionStart = change.Offset + 1;
                                source.SelectionLength = source.Text.Length;
                                }
                            }
                    InProg = false;
                    }
                }
    

    Then make a simple PreviewKeyDown handler:

        private static bool DelKeyPressed;
        internal static void DelPressed(object sender, KeyEventArgs e)
        { if ( e.Key == Key.Back ) { DelKeyPressed = true; } else { DelKeyPressed = false; } }
    

    In this example "Files" is a list of directory names created on application startup.

    Then just attach the handlers:

    public class YourClass
      {
      public YourClass()
        {
        YourTextbox.PreviewKeyDown += DelPressed;
        YourTextbox.TextChanged += TBTextChanged;
        }
      }
    

    With this whatever you choose to put in the List will be used for the autocomplete box. This may not be a great option if you expect to have an enormous list for the autocomplete but in my app it only ever sees 20-50 items so it cycles through very quick.

    0 讨论(0)
  • 2020-11-27 11:39

    Nimgoble's is the version I used in 2015. Thought I'd put it here as this question was top of the list in google for "wpf autocomplete textbox"

    1. Install nuget package for project in Visual Studio

    2. Add a reference to the library in the xaml:
      xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"

    3. Create a textbox and bind the AutoCompleteBehaviour to List<String> (TestItems):
      <TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}" behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />

    IMHO this is much easier to get started and manage than the other options listed above.

    0 讨论(0)
提交回复
热议问题