WPF-002 下拉列表的简单实现
发布日期:2021-11-07 06:41:03 浏览次数:8 分类:技术文章

本文共 4978 字,大约阅读时间需要 16 分钟。

最近在一个WPF项目中用到一个下拉列表,随着用户输入字符而进行显示,使用了绑定等知识,虽然实现比较简单,可是在性能上也是想了很多办法终于才勉强可以用,与大家分享下。

用于页面绑定的模型类:

public class MainWindowModel : INotifyPropertyChanged    {        public event PropertyChangedEventHandler PropertyChanged;        private ObservableCollection
names = new ObservableCollection
(); private bool popupIsOpen = false; public bool PopupIsOpen { get { return popupIsOpen; } set { popupIsOpen = value; this.PropertyChanged(this, new PropertyChangedEventArgs("PopupIsOpen")); } } public ObservableCollection
Names { get { return this.names; } set { this.names = value; this.PropertyChanged(this, new PropertyChangedEventArgs("Names")); } } } public class Content { private string name=string.Empty; public string Name { get { return this.name; } set { name = value; } } }

后台代码:

///     /// MainWindow.xaml 的交互逻辑    ///     public partial class MainWindow : Window    {        private MainWindowModel model = new MainWindowModel();        private List
threadPool = new List
(); public MainWindow() { InitializeComponent(); this.DataContext = model; } ///
/// 在此增加内容 /// private void InitialSetValue() { this.Dispatcher.BeginInvoke(new Action(() => { this.model.Names.Clear(); for (int i = 0; i < 100; i++) { Content content = new Content(); content.Name = i.ToString() + i.ToString() + i.ToString() + i.ToString() + i.ToString(); this.model.Names.Add(content); } })); } ///
/// 下拉菜单消失要清空内容 /// ///
///
private void popupContent_Closed(object sender, EventArgs e) { this.model.Names.Clear(); } ///
/// 文本框失去焦点,下拉列表隐藏 /// ///
///
private void textBox1_LostFocus(object sender, RoutedEventArgs e) { this.model.PopupIsOpen = false; } ///
/// 文字内容改变,下拉类表出现 /// ///
///
private void textBox1_TextChanged(object sender, TextChangedEventArgs e) { this.model.PopupIsOpen = true; if (threadPool.Count > 0) { threadPool[0].CancelAsync(); } threadPool.Clear(); string key = this.textBox1.Text.Trim(); if (string.IsNullOrEmpty(key)) { this.model.PopupIsOpen = false; return; } BackgroundWorker worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.WorkerSupportsCancellation = true; worker.DoWork += (o, p) => { InitialSetValue(); p.Result = this.model.Names; }; worker.RunWorkerCompleted += (o, p) => { this.model.Names = p.Result as ObservableCollection
; if (this.model.Names.Count <= 0) { this.model.PopupIsOpen = false; } }; threadPool.Add(worker); Thread.Sleep(100); if (threadPool.Count > 0) { threadPool[0].RunWorkerAsync(); } } ///
/// 子项被选中,下拉列表消失 /// ///
///
private void item_SelectionChanged(object sender, SelectionChangedEventArgs e) { var data = (sender as ListBox).SelectedItem as Content; if (data == null) { this.model.PopupIsOpen = false; return; } try { this.textBox1.TextChanged -= new TextChangedEventHandler(textBox1_TextChanged); var searchtext = data.Name; this.model.PopupIsOpen = false; } catch { } finally { this.textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged); } } }

页面代码:

效果:

主要注意的有一点,下拉列表消失时一定要清除数据,不然下次显示的时候会很慢。在用的时候找了好久才发现这个问题。

详细工程:

转载地址:https://blog.csdn.net/yysyangyangyangshan/article/details/8177878 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:DLL版本不兼容问题
下一篇:C#提高知识 ADO.NET实体数据模型(1)

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月11日 10时29分37秒