2010-02-26 24 views
45

This other SO question chiede una casella di testo a completamento automatico in WPF. Diverse persone li hanno creati e una delle risposte fornite suggerisce this codeproject article.WPF: Casella di testo con completamento automatico, ... nuovamente

Ma non ho trovato alcuna casella di testo di completamento automatico WPF che si confronta con la casella di testo di completamento automatico di WinForms. Il campione CodeProject funziona, sorta di ...

alt text http://i50.tinypic.com/sx2ej5.jpg

... ma

  • non è strutturata come un controllo riutilizzabile o DLL. È il codice che ho bisogno di incorporare in ogni app.
  • Funziona solo con le directory. non ha proprietà per impostare se l'origine del completamento automatico è solo directory del filesystem, file filesystem, o .... ecc. Potrei scrivere codice per farlo, ovviamente, ma ... preferirei usare il codice di qualcun altro già scritto.
  • non ha le proprietà per impostare le dimensioni dei popup, ecc.
  • c'è una casella di riepilogo popup che presenta i completamenti possibili. Durante la navigazione in quell'elenco, la casella di testo non cambia. Digitando un personaggio mentre si è concentrati nella casella di riepilogo non si ottiene l'aggiornamento della casella di testo.
  • lo spostamento dello stato attivo fuori dalla casella di riepilogo non fa scomparire la casella di riepilogo popup. Questo è confusionario.

Quindi, la mia domanda:

* Qualcuno ha una casella di testo libero WPF completamento automatico che funziona, e fornisce un'esperienza utente di qualità *


RISPOSTA

?

Ecco come l'ho fatto:

.0. get the WPF Toolkit

.1. eseguire l'MSI per WPF Toolkit

.2. In Visual Studio, trascina/rilascia dalla casella degli strumenti, in particolare il gruppo Data Visualization, in UI Designer. Ecco come si presenta nella casella degli strumenti VS:

alt text http://i49.tinypic.com/s12q6x.jpg

Se non si desidera utilizzare il progettista, mano-craft XAML. Ecco come si presenta:


<toolkit:AutoCompleteBox 
    ToolTip="Enter the path of an assembly." 
    x:Name="tbAssembly" Height="27" Width="102" 
    Populating="tbAssembly_Populating" /> 

... dove lo spazio dei nomi toolkit è mappato in questo modo:

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

.3. Fornire il codice per l'evento Populating.Ecco quello che ho usato:


private void tbAssembly_Populating(object sender, System.Windows.Controls.PopulatingEventArgs e) 
{ 
    string text = tbAssembly.Text; 
    string dirname = Path.GetDirectoryName(text); 

    if (Directory.Exists(Path.GetDirectoryName(dirname))) 
    { 
     string[] files = Directory.GetFiles(dirname, "*.*", SearchOption.TopDirectoryOnly); 
     string[] dirs = Directory.GetDirectories(dirname, "*.*", SearchOption.TopDirectoryOnly); 
     var candidates = new List<string>(); 

     Array.ForEach(new String[][] { files, dirs }, (x) => 
      Array.ForEach(x, (y) => 
         { 
          if (y.StartsWith(dirname, StringComparison.CurrentCultureIgnoreCase)) 
           candidates.Add(y); 
         })); 

     tbAssembly.ItemsSource = candidates; 
     tbAssembly.PopulateComplete(); 
    } 
} 

Funziona, proprio come ci si aspetterebbe. Sembra professionale. Non ci sono anomalie che il controllo codeproject mostri. Questo è ciò che sembra:

alt text http://i50.tinypic.com/24qsopy.jpg


Thanks to Matt for the pointer al toolkit WPF.

risposta

32

Il nuovo drop dello WPF Toolkit include un AutoCompleteBox. Si tratta di un set di controlli di Microsoft, alcuni dei quali saranno inclusi nel .NET 4.

Jeff Wilcox - Introducing the AutoCompleteBox

+0

Suona intrigante, Matt. C'è una guida o un esempio sull'uso di AutoCompleteBox? Ho trovato la DLL che lo contiene. Quali xmlns devo usare in XAML? Come lo uso? – Cheeso

+0

Nota che il link al post del blog ho appena aggiunto discussioni su Silverlight, ma AutoCompleteBox è anche per WPF. –

+0

WPF Toolkit su CodePlex è morto, ma ci sono diversi fork su GitHub, se qualcuno ne ha bisogno: [jogibear9988/wpftoolkit] (https://github.com/jogibear9988/wpftoolkit), [WPFToolkit.DataVisualization] (https://github.com/davidalpert/WPFToolkit.DataVisualization), [theonlylawislove/WPFToolkit] (https://github.com/theonlylawislove/WPFToolkit), [jrwren/wpftoolkit] (https://github.com/jrwren/wpftoolkit). – Athari

17

Ecco come ho fatto:

.1. eseguire l'MSI per WPF Toolkit

.2. In Visual Studio, trascina/rilascia dalla casella degli strumenti, in particolare il gruppo Data Visualization, in UI Designer. Ecco come si presenta nella casella degli strumenti VS:

alt text http://i49.tinypic.com/s12q6x.jpg

Oppure, mano-craft XAML. Ecco come si presenta:


<toolkit:AutoCompleteBox 
    ToolTip="Enter the path of an assembly." 
    x:Name="tbAssembly" Height="27" Width="102" 
    Populating="tbAssembly_Populating" /> 

... dove lo spazio dei nomi toolkit è mappato in questo modo:

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

.3. Fornire il codice per l'evento Populating. Ecco quello che ho usato:


private void tbAssembly_Populating(object sender, System.Windows.Controls.PopulatingEventArgs e) 
{ 
    string text = tbAssembly.Text; 
    string dirname = Path.GetDirectoryName(text); 

    if (Directory.Exists(Path.GetDirectoryName(dirname))) 
    { 
     string[] files = Directory.GetFiles(dirname, "*.*", SearchOption.TopDirectoryOnly); 
     string[] dirs = Directory.GetDirectories(dirname, "*.*", SearchOption.TopDirectoryOnly); 
     var candidates = new List<string>(); 

     Array.ForEach(new String[][] { files, dirs }, (x) => 
      Array.ForEach(x, (y) => 
         { 
          if (y.StartsWith(dirname, StringComparison.CurrentCultureIgnoreCase)) 
           candidates.Add(y); 
         })); 

     tbAssembly.ItemsSource = candidates; 
     tbAssembly.PopulateComplete(); 
    } 
} 

Grazie a Matt per il puntatore al toolkit WPF.

2

Uso l'Intellibox nel mio progetto interno. http://intellibox.codeplex.com/

Trovo che l'utilizzo del modello Provider per la ricerca sia molto intuitivo.

La risposta di Rake fornisce un esempio di come utilizzarlo e, come sottolinea, ha visto alcuni sviluppi alla fine dell'anno scorso (anche se questo è successo dopo l'ultimo utilizzo).

+1

http://intellibox.codeplex.com/ sembra aggiornato da poco il 1 ° ottobre 2013 e contiene il controllo singolo. (Grazie, Rake) – Cheeso

+0

Sì, non ci ho lavorato per un po ', è bello sapere che da allora ha attirato l'attenzione. Grazie! – Troy

2

Mindscape fornisce anche una 3 free controls tra cui un WPF completamento automatico Textbox

http://intellibox.codeplex.com/ sembra aggiornato di recente, 1 Ottobre 2013 e contiene il singolo controllo. Avrei aggiunto come commento alla risposta di Troy, ma non ho abbastanza rep. L'ho quasi ignorato a causa di quel commento.

Esempio di utilizzo da documentazione:

<auto:Intellibox ResultsHeight="80" 
        ExplicitlyIncludeColumns="True" 
        Name="lightspeedBox" 
        DisplayedValueBinding="{Binding Product_Name}" 
        SelectedValueBinding="{Binding Product_Id}" 
        DataProvider="{Binding RelativeSource={RelativeSource FindAncestor, 
        AncestorType={x:Type Window}}, Path=LinqToEntitiesProvider}" 
        Height="26" 
        Margin="12,26,12,0" 
        VerticalAlignment="Top"> 
     <auto:Intellibox.Columns> 
      <auto:IntelliboxColumn DisplayMemberBinding="{Binding Product_Name}" 
            Width="150" 
            Header="Product Name" /> 
      <auto:IntelliboxColumn DisplayMemberBinding="{Binding Unit_Price}" 
            Width="75" 
            Header="Unit Price" /> 
      <auto:IntelliboxColumn DisplayMemberBinding="{Binding Suppliers.Company_Name}" 
            Width="125" 
            Header="Supplier" /> 
     </auto:Intellibox.Columns> 
    </auto:Intellibox> 
2

si può provare WPF Auto TextBox completo a CodePlex qui: https://wpfautocomplete.codeplex.com/

+2

Vedo che questo è il tuo progetto, e sembra buono, ma dovresti fare di più che aggiungere un link qui. Aggiungi del codice di esempio, istruzioni, mostra perché è una possibile soluzione per l'OP. StackOverflow è essenzialmente un wiki di domande e risposte, quindi gli utenti si aspettano di vedere abbastanza dettagli nella risposta per vedere che quella soluzione funzionerà per loro senza essere portata via da questo sito. Con qualsiasi mezzo indirizzare le persone al sito di codeplex per ulteriori informazioni. –

+1

Ho passato la mattinata a controllare le caselle di testo autocompletate che ho trovato in diversi punti della rete. Questo è di gran lunga il migliore, ed è quello che userò nel mio progetto. – dlf

Problemi correlati