WPF-002 下拉列表的简单实现
发布日期:2021-11-07 06:41:03
浏览次数:8
分类:技术文章
本文共 4978 字,大约阅读时间需要 16 分钟。
最近在一个WPF项目中用到一个下拉列表,随着用户输入字符而进行显示,使用了绑定等知识,虽然实现比较简单,可是在性能上也是想了很多办法终于才勉强可以用,与大家分享下。
用于页面绑定的模型类:
public class MainWindowModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private ObservableCollectionnames = 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 ListthreadPool = 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年04月11日 10时29分37秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python字符编码和转码
2019-05-02
SOCAT端口转发
2019-05-02
docker快速搭建HTTP代理
2019-05-02
ActiveReports 报表应用教程 (14)---数据可视化
2019-05-03
TestNG 学习总结 - 忽略测试(八)
2019-05-03
TestNG 学习总结 - 测试结果报告(十四)
2019-05-03
Java对象深复制、浅复制
2019-05-03
细分自动化测试
2019-05-03
使用WebDriver完成web页面切换操作(附源码)
2019-05-03
蓝桥杯题解(三)
2019-05-03
Scala学习第十二天 Scala中的继承:超类的构造、重写字段、重写方法代码实战
2019-05-03
剑指offer:字符串的组合(java)
2019-05-03
实时开发框架Meteor API解读系列<二>Core
2019-05-03
实时开发框架Meteor 实际应用系列<一>---文件的上传和下载[补充]
2019-05-03
启用fcitx-qimpanel面板程序
2019-05-03
浅谈Q的基本实现
2019-05-03
阿里云短信服务(JAVA)
2019-05-03
GCD使用 串行并行队列 与 同步异步执行的各种组合 及要点分析
2019-05-03
深入研究 Runloop 与线程保活
2019-05-03