WPF: AutoComplete TextBox,… novamente

Essa outra pergunta sobre SO pergunta sobre uma checkbox de texto de autocomplete no WPF. Várias pessoas as construíram, e uma das respostas dadas sugere este artigo do projeto de código .

Mas não encontrei nenhuma Caixa de texto de preenchimento automático do WPF que seja comparada com a checkbox de texto de preenchimento automático do WinForms. O exemplo de amostra de código funciona, mais ou menos …

texto alternativo http://sofpt.miximages.com/autocomplete/sx2ej5.png

…mas

  • não está estruturado como um controle reutilizável ou DLL. É o código que preciso incorporar em todos os aplicativos.
  • Funciona apenas com diretórios. ele não possui propriedades para definir se a origem de autocomplete é apenas diretórios do sistema de arquivos, ou arquivos do sistema de arquivos, ou …. etc. Eu poderia escrever código para fazer isso, é claro, mas … Eu prefiro usar o código de outra pessoa já escrito.
  • não tem propriedades para definir o tamanho do pop-up, etc.
  • Há uma checkbox de listview pop-up que apresenta as conclusões possíveis. Ao navegar por essa lista, a checkbox de texto não é alterada. Digitar um caractere enquanto focado na checkbox de listview não faz com que a checkbox de texto seja atualizada.
  • navegar longe do foco da checkbox de listview não faz com que a checkbox de listview pop-up desapareça. Isso é confuso.

Então, minha pergunta:

* Alguém tem uma checkbox de texto WPF AutoComplete GRATUITA que funciona e fornece uma experiência de qualidade de interface de usuário? *


RESPONDA

Veja como eu fiz:

.0. obter o kit de ferramentas do WPF

.1. executar o MSI para o kit de ferramentas do WPF

.2. No Visual Studio, Arraste / solte na checkbox de ferramentas – especificamente no grupo Visualização de Dados – no Designer de UI. Parece com isso na checkbox de ferramentas do VS:

texto alternativo http://sofpt.miximages.com/autocomplete/s12q6x.png

Se você não quiser usar o designer, crie o xaml manualmente. Se parece com isso:


 

… onde o namespace do kit de ferramentas é mapeado dessa maneira:

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

.3. Forneça o código para o evento Populating . Aqui está o que eu usei:


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

Funciona do jeito que você espera. Parece profissional. Não há nenhuma das anomalias que o controle de projeto de código exibe. Isto é o que parece:

texto alt http://sofpt.miximages.com/autocomplete/24qsopy.png


Obrigado ao Matt pelo ponteiro para o kit de ferramentas do WPF.

A última gota do WPF Toolkit inclui uma AutoCompleteBox. É um conjunto gratuito de controles da Microsoft, alguns dos quais serão incluídos no .NET 4.

Jeff Wilcox – Apresentando o AutoCompleteBox

Veja como eu fiz:

.1. executar o MSI para o kit de ferramentas do WPF

.2. No Visual Studio, Arraste / solte na checkbox de ferramentas – especificamente no grupo Visualização de Dados – no Designer de UI. Parece com isso na checkbox de ferramentas do VS:

texto alternativo http://sofpt.miximages.com/autocomplete/s12q6x.png

Ou, ofereça o xaml manualmente. Se parece com isso:


  

… onde o namespace do kit de ferramentas é mapeado dessa maneira:

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

.3. Forneça o código para o evento Populating . Aqui está o que eu usei:


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

Obrigado ao Matt pelo ponteiro para o kit de ferramentas do WPF.

O Mindscape também oferece 3 controles gratuitos, incluindo uma Caixa de texto de preenchimento automático do WPF

http://intellibox.codeplex.com/ parece atualizado até 1 de outubro de 2013 e contém o controle único. Eu teria acrescentado como comentário a resposta de Troy, mas não tenho representante suficiente. Eu quase ignorei por causa desse comentário.

Exemplo de uso da documentação:

         

Eu uso o Intellibox no meu projeto interno. http://intellibox.codeplex.com/

Eu acho que é uso do padrão Provider para pesquisas muito intuitivas.

A resposta de Rake fornece um exemplo de como usá-lo, e como ele aponta, ele viu algum desenvolvimento no final do ano passado (embora isso esteja bem depois da última vez que o usei).

Você pode experimentar o WPF Auto Complete TextBox na CodePlex aqui: https://wpfautocomplete.codeplex.com/