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?
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?
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.
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.
và đây ngã ba của Mà toolkit chứa các cổng để 4.O,
https://github.com/jogibear9988/wpftoolkit
nó đã làm việc rất tốt với tôi.
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/.
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"
Install NuGet gói cho dự án trong Visual Studio
Thêm một tham chiếu đến thư viện trong XAML:
xmlns:behaviors="clr-namespace:WPFTextBoxAutoComplete;assembly=WPFTextBoxAutoComplete"
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.
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
@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
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.
'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 đó. –
@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