2009-06-04 38 views
45

Có thể tạo hộp văn bản tự động hoàn thành trong WPF không?Hộp văn bản tự động hoàn thành trong WPF

Tôi đã tìm thấy một mẫu trong đó hộp tổ hợp được sử dụng và tam giác bị xóa bằng cách chỉnh sửa mẫu kiểu.

Có giải pháp nào tốt hơn không?

Trả lời

31

Bạn có thể tìm thấy một trong số WPF Toolkit, cũng có sẵn qua NuGet.

Bài viết này giới thiệu cách tạo hộp văn bản có thể tự động đề xuất các mục trong thời gian chạy dựa trên đầu vào, trong trường hợp này là các thư mục ổ đĩa. WPF AutoComplete Folder TextBox

Ngoài ra hãy xem cái này đẹp Reusable WPF Autocomplete TextBox, nó rất hữu ích cho tôi.

5

hoặc bạn có thể thêm AutoCompleteBox vào hộp công cụ bằng cách nhấp vào nó và sau đó chọn mục, đi đến thành phần WPF, nhập vào hộp lọc AutoCompleteBox, trên không gian tên System.Windows.Controls và chỉ cần kéo vào xaml của bạn tập tin. Đây là cách dễ dàng hơn nhiều so với làm những thứ khác, vì AutoCompleteBox là một điều khiển riêng.

+12

'System.Windows.Controls.AutoCompleteBox' không phải là một phần của WPF. Bạn sẽ phải thêm một tham chiếu đến [WPF Toolkit] (http://wpf.codeplex.com/) để sử dụng điều khiển đó. –

+0

@MartinLiversage Tôi đã thêm bộ công cụ wpf cho studio trực quan năm 2013. Nhưng hộp hoàn toàn tự động không thể nhìn thấy trong hộp công cụ. tại sao vậy? – vigamage

8

Tôi đã xuất bản Hộp văn bản hoàn thành tự động WPF trong WPF tại CodePlex.com. Bạn có thể tải xuống và dùng thử từ https://wpfautocomplete.codeplex.com/.

9

Nimgoble's là phiên bản tôi sử dụng trong năm 2015. Tư tưởng tôi muốn đặt nó ở đây là câu hỏi này đã đứng đầu danh sách trong google cho "textbox autocomplete WPF"

  1. Install NuGet gói cho dự án trong Visual Studio

  2. Thêm một tham chiếu đến thư viện trong XAML:
    xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"

  3. Tạo một textbox và ràng buộc AutoComplet eBehaviour để List<String> (TestItems):
    <TextBox Text="{Binding TestText, UpdateSourceTrigger=PropertyChanged}" behaviors:AutoCompleteBehavior.AutoCompleteItemsSource="{Binding TestItems}" />

IMHO này là dễ dàng hơn nhiều để bắt đầu và quản lý hơn các tùy chọn khác được liệt kê ở trên.

+3

Hoạt động tốt để tự động điền nội tuyến, nhưng không cung cấp danh sách thả xuống có các tùy chọn .. – lambinator

+0

@lambinator - có không thả xuống. Từ một POV thiết kế, nếu tôi chỉ có một vài mục (nói <20-50?) Sau đó, tôi chỉ sử dụng một combobox thông thường bởi vì bạn có thể gõ trước trong nó anyway: http://stackoverflow.com/a/8333801/345659. Nếu tôi có quá nhiều mục để hiển thị (ai muốn cuộn theo tuổi?) Thì tôi sử dụng hộp văn bản tự động hoàn thành này. – JumpingJezza

3

Tôi biết đây là câu hỏi rất cũ nhưng tôi muốn thêm câu trả lời tôi đã đưa ra.

Trước tiên, bạn cần một handler cho handler TextChanged kiện bình thường của bạn cho 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; 
       } 
      } 

Sau đó tạo một PreviewKeyDown xử lý đơn giản:

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

Trong ví dụ này "Files" là một danh sách các tên thư mục được tạo khi khởi động ứng dụng.

Sau đó chỉ cần đính kèm các trình xử lý:

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

Với điều này bất cứ điều gì bạn chọn để đưa vào List sẽ được sử dụng cho hộp autocomplete. Đây có thể không phải là một lựa chọn tuyệt vời nếu bạn mong đợi có một danh sách khổng lồ cho tính năng tự động hoàn thành nhưng trong ứng dụng của tôi, nó chỉ bao giờ thấy 20-50 mục nên nó chuyển qua rất nhanh.

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