2010-02-26 39 views
45

This other SO question hỏi về hộp văn bản tự động hoàn thành trong WPF. Một số người đã xây dựng những điều này và một trong những câu trả lời được đưa ra ở đó gợi ý this codeproject article.WPF: Hộp văn bản tự động hoàn thành, ... lại

Nhưng tôi không tìm thấy bất kỳ Hộp văn bản tự động hoàn thành WPF nào so sánh với hộp văn bản tự động hoàn thành WinForms. Mẫu CodeProject hoạt động, loại, ...

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

... nhưng

  • nó không được cấu trúc như một điều khiển tái sử dụng hoặc DLL. Đó là mã tôi cần phải nhúng trong mọi ứng dụng.
  • Chỉ hoạt động với các thư mục. nó không có các thuộc tính để thiết lập cho dù nguồn tự động hoàn thành chỉ là các thư mục hệ thống tập tin hay các tệp hệ thống tệp, hoặc .... vv. Tôi có thể viết mã để làm điều này, tất nhiên, nhưng ... Tôi muốn sử dụng mã của người khác đã được viết.
  • không có thuộc tính để đặt kích thước bật lên, v.v.
  • có hộp danh sách bật lên hiển thị số lần hoàn thành có thể đặt. Khi điều hướng qua danh sách đó, hộp văn bản không thay đổi. Nhập một ký tự trong khi tập trung vào hộp danh sách sẽ không làm cho hộp văn bản được cập nhật.
  • điều hướng tiêu điểm ra khỏi hộp danh sách không làm cho hộp danh sách bật lên biến mất. Điều này là khó hiểu.

Vì vậy, câu hỏi của tôi:

* Có ai có một textbox miễn phí WPF AutoComplete mà làm việc, và cung cấp một kinh nghiệm chất lượng UI *


ĐÁP

?

Đây là cách tôi đã thực hiện:

.0. lấy số WPF Toolkit

.1. chạy MSI cho Bộ công cụ WPF

.2. Trong Visual Studio, kéo/thả từ hộp công cụ - cụ thể là nhóm Hình ảnh hóa dữ liệu - vào trong Trình thiết kế giao diện người dùng. Nó trông giống như thế này trong hộp công cụ VS:

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

Nếu bạn không muốn sử dụng các nhà thiết kế, tay nghề XAML. Nó trông giống như thế này:


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

... nơi không gian tên toolkit được ánh xạ theo cách này:

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

.3. Cung cấp mã cho sự kiện Populating.Đây là những gì tôi đã sử dụng:


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

Nó hoạt động, chỉ cần theo cách bạn mong muốn. Nó cảm thấy chuyên nghiệp. Không có bất kỳ sự bất thường nào mà sự kiểm soát từ mã vạch trưng bày. Đây là những gì nó trông giống như:

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


Thanks to Matt for the pointer để bộ công cụ WPF.

Trả lời

32

Mức giảm mới nhất của WPF Toolkit bao gồm một AutoCompleteBox. Đó là một tập miễn phí của điều khiển từ Microsoft, một số trong đó sẽ được đưa vào NET 4.

Jeff Wilcox - Introducing the AutoCompleteBox

+0

Âm thanh hấp dẫn, Matt. Có hướng dẫn hoặc ví dụ về cách sử dụng AutoCompleteBox không? Tôi tìm thấy DLL có chứa nó. Tôi sử dụng xmlns nào trong XAML? Tôi thực sự sử dụng nó như thế nào? – Cheeso

+0

Lưu ý rằng liên kết bài đăng trên blog tôi vừa thêm các cuộc đàm phán về Silverlight, nhưng AutoCompleteBox cũng dành cho WPF. –

+0

Bộ công cụ WPF trên CodePlex đã chết, nhưng có một số nhánh trên GitHub, nếu có ai đó cần: [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

Đây là cách tôi đã làm nó:

.1. chạy MSI cho Bộ công cụ WPF

.2. Trong Visual Studio, kéo/thả từ hộp công cụ - cụ thể là nhóm Hình ảnh hóa dữ liệu - vào trong Trình thiết kế giao diện người dùng. Nó trông giống như thế này trong hộp công cụ VS:

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

Hoặc, tay nghề XAML. Nó trông giống như thế này:


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

... nơi không gian tên toolkit được ánh xạ theo cách này:

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

.3. Cung cấp mã cho sự kiện Populating. Đây là những gì tôi đã sử dụng:


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

Nhờ Matt cho con trỏ đến bộ công cụ WPF.

2

Tôi sử dụng Intellibox trong dự án nội bộ của mình. http://intellibox.codeplex.com/

Tôi thấy việc sử dụng mẫu Nhà cung cấp để tìm kiếm rất trực quan.

Câu trả lời của Rake cung cấp một ví dụ về cách sử dụng nó, và như ông đã chỉ ra, nó đã thấy một số phát triển vào cuối năm ngoái (mặc dù điều này là sau khi tôi sử dụng nó lần cuối).

+1

http://intellibox.codeplex.com/ dường như được cập nhật gần đây nhất là ngày 1 tháng 10 năm 2013 và chứa một điều khiển duy nhất. (Cảm ơn, Rake) – Cheeso

+0

Có, tôi đã không làm việc trên đó một lúc, tốt đẹp để biết nó đã thấy một số sự chú ý kể từ đó. Cảm ơn! – Troy

2

Mindscape cũng cung cấp một 3 free controls bao gồm một WPF Autocomplete Textbox

http://intellibox.codeplex.com/ dường như được cập nhật gần đây nhất là ngày 01 tháng 10 2013 và chứa các điều khiển đơn. Tôi đã có thể thêm vào như bình luận về câu trả lời của Troy, nhưng không có đại diện đủ. Tôi gần như bỏ qua nó vì nhận xét đó.

Ví dụ sử dụng từ tài liệu:

<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

Bạn có thể thử WPF Auto Complete TextBox tại CodePlex đây: https://wpfautocomplete.codeplex.com/

+2

Tôi thấy đây là dự án của bạn, và nó có vẻ tốt, nhưng bạn nên làm nhiều hơn là chỉ cần thêm một liên kết ở đây. Thêm một số mã mẫu, hướng dẫn, cho thấy lý do tại sao nó là một giải pháp có thể cho OP. StackOverflow là một Q & A wiki về cơ bản, vì vậy người dùng mong đợi để xem đủ chi tiết trong câu trả lời để thấy rằng giải pháp đó sẽ làm việc cho họ mà không bị lấy đi khỏi trang web này. Bởi tất cả có nghĩa là người trực tiếp đến trang web codeplex để biết thêm thông tin. –

+1

Tôi đã dành buổi sáng của mình để tự động soạn thảo các hộp văn bản tự động hoàn thành mà tôi tìm thấy ở các vị trí khác nhau trên mạng. Đây là một trong những tốt nhất, và là một trong những tôi sẽ được sử dụng trong dự án của tôi. – dlf

Các vấn đề liên quan