WPF-002 下拉列表的简单实现
最近在一个WPF项目中用到一个下拉列表,随着用户输入字符而进行显示,使用了绑定等知识,虽然实现比较简单,可是在性能上也是想了很多办法终于才勉强可以用,与大家分享下。
用于页面绑定的模型类:
public class MainWindowModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private ObservableCollection<Content> names = new ObservableCollection<Content>(); private bool popupIsOpen = false; public bool PopupIsOpen { get { return popupIsOpen; } set { popupIsOpen = value; this.PropertyChanged(this, new PropertyChangedEventArgs("PopupIsOpen")); } } public ObservableCollection<Content> 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; } } }
后台代码:
/// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { private MainWindowModel model = new MainWindowModel(); private List<BackgroundWorker> threadPool = new List<BackgroundWorker>(); public MainWindow() { InitializeComponent(); this.DataContext = model; } /// <summary> /// 在此增加内容 /// </summary> 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); } })); } /// <summary> /// 下拉菜单消失要清空内容 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void popupContent_Closed(object sender, EventArgs e) { this.model.Names.Clear(); } /// <summary> /// 文本框失去焦点,下拉列表隐藏 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void textBox1_LostFocus(object sender, RoutedEventArgs e) { this.model.PopupIsOpen = false; } /// <summary> /// 文字内容改变,下拉类表出现 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> 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<Content>; if (this.model.Names.Count <= 0) { this.model.PopupIsOpen = false; } }; threadPool.Add(worker); Thread.Sleep(100); if (threadPool.Count > 0) { threadPool[0].RunWorkerAsync(); } } /// <summary> /// 子项被选中,下拉列表消失 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> 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); } } }
页面代码:
<Window x:Class="TestPopup.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <TextBox Height="38" HorizontalAlignment="Left" Margin="71,89,0,0" LostFocus="textBox1_LostFocus" TextChanged="textBox1_TextChanged" Name="textBox1" VerticalAlignment="Top" Width="236" /> <Popup Name="popupContent" StaysOpen="False" IsOpen="{Binding PopupIsOpen}" Closed="popupContent_Closed" Placement="Bottom" PlacementTarget="{Binding ElementName=textBox1}" > <ListBox Name="contentItems" SelectionChanged="item_SelectionChanged" ItemsSource="{Binding Names}" MinWidth="{Binding ElementName=textBox1, Path=ActualWidth}"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Margin="5,5" FontSize="15" Text="{Binding Name}" Foreground="Gray"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Popup> </Grid> </Window>
效果:
主要注意的有一点,下拉列表消失时一定要清除数据,不然下次显示的时候会很慢。在用的时候找了好久才发现这个问题。
详细工程:http://download.csdn.net/detail/yysyangyangyangshan/4762184
WPF-002 下拉列表的简单实现相关推荐
- WPF:下拉列表的简单实现
最近在一个WPF项目中用到一个下拉列表,随着用户输入字符而进行显示,使用了绑定等知识,虽然实现比较简单,可是在性能上也是想了很多办法终于才勉强可以用,与大家分享下. 用于页面绑定的模型类: 1 pub ...
- SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务)
2019独角兽企业重金招聘Python工程师标准>>> SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务) 一.大致介绍 微服务与微服务之间通过 ...
- Android页面下拉列表的简单页面
首先打开安卓的ADT软件 创建一个项目,取名为Day08 我们今天创建这样的一个Android页面 视图分析:该图是由6个线性布局<LinearLayout>(如下图六个红线框框),文本框 ...
- 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器
从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 这段时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Calibu ...
- WPF Expander控件简单样式
WPF Expander控件简单样式 样式代码: <Style x:Key="ExpanderStyle1" TargetType="{x:Type Expande ...
- Prism for WPF初探(构建简单的模块化开发框架)
先简单的介绍一下Prism框架,引用微软官方的解释: Prism provides guidance to help you more easily design and build, flexibl ...
- Prism For WPF Login对话框又简单又合理的方案之一
一.前言 这是一篇极简的小短文.首先感谢站长和各位WPF大佬对我的指导,我学到了很多,还是关于利用Prism做Login对话框的事情,看到站长发过一篇<WPF Prism框架Region失效了? ...
- WPF框架教程 | 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器
之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Caliburn.Micro(https://blog.csdn.net/lzuacm/ar ...
- 基于WPF的桌面宠物开发(一) :WPF简介+环境搭建+简单界面
目录 一.WPF简介 1.什么是WPF? 二.WPF环境搭建 1.Visual Studio安装 2.安装 ".Net桌面开发" 工具包 3.新建WPF项目 4.导入WpfAnim ...
最新文章
- 新闻发布系统类图_如何熟悉一个系统?(内含知识大图)
- 深圳部分写字楼租金暴跌,为何会出现这种情况?
- 【链接】Solr的Filed中indexed与stored属性
- linux文件管理服务,linux系统配置及服务管理_文件管理
- HDU-1233-还是畅通工程(最小生成树)
- 60. MySQLi 扩展拾遗
- php一键环境包xammp 安装 phpDocumentor
- java调用数据库的基本步骤_java数据库操作基本流程和技巧
- 笔记本键盘有几个键失灵了怎么办?
- [Wondgirl]从零开始学React Native之Text(五)
- 两台电脑之间串口传输文件
- 学生专用计算机怎么调时间,学生计算器怎么调时间
- for循环的auto用法
- 使用百度云盘快速下载文件
- 计算机英语wheel是什么意思,wheel是什么意思
- SQL存储过程根据,循环取出数据
- 创客机器人比赛简讯_“让思维沸腾,让创造先行”——记我校参加同安区首届创客大赛活动报道...
- vue-cli脚手架是什么及其脚手架搭建
- JAVA生成二维码扫码进入h5微信支付宝支付
- 微信小程序的简单介绍
热门文章
- pythonbool运算教学_python,_pandas Series bool与运算,python - phpStudy
- 三菱plc232数据线驱动下载_三菱PLC与西门子PLC有什么区别?
- python处在哪个阶段_python 基础复习
- iOS 命令行自动打包 (archive)
- 云计算开发要学习哪些东西?云计算开发的内容
- 学习 JavaScript (四)核心概念:操作符
- 从 Java 到 Scala(二):object
- 写一篇C语言入门第一讲
- aspx页面使用ajax遇到try catch中使用Response.End()报错
- HTML form 标签的 enctype 属性