最近在一个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 下拉列表的简单实现相关推荐

  1. WPF:下拉列表的简单实现

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

  2. SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务)

    2019独角兽企业重金招聘Python工程师标准>>> SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务) 一.大致介绍 微服务与微服务之间通过 ...

  3. Android页面下拉列表的简单页面

    首先打开安卓的ADT软件 创建一个项目,取名为Day08 我们今天创建这样的一个Android页面 视图分析:该图是由6个线性布局<LinearLayout>(如下图六个红线框框),文本框 ...

  4. 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

    从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器 这段时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Calibu ...

  5. WPF Expander控件简单样式

    WPF Expander控件简单样式 样式代码: <Style x:Key="ExpanderStyle1" TargetType="{x:Type Expande ...

  6. Prism for WPF初探(构建简单的模块化开发框架)

    先简单的介绍一下Prism框架,引用微软官方的解释: Prism provides guidance to help you more easily design and build, flexibl ...

  7. Prism For WPF Login对话框又简单又合理的方案之一

    一.前言 这是一篇极简的小短文.首先感谢站长和各位WPF大佬对我的指导,我学到了很多,还是关于利用Prism做Login对话框的事情,看到站长发过一篇<WPF Prism框架Region失效了? ...

  8. WPF框架教程 | 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

    之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发,是时候总结一下了. Caliburn.Micro(https://blog.csdn.net/lzuacm/ar ...

  9. 基于WPF的桌面宠物开发(一) :WPF简介+环境搭建+简单界面

    目录 一.WPF简介 1.什么是WPF? 二.WPF环境搭建 1.Visual Studio安装 2.安装 ".Net桌面开发" 工具包 3.新建WPF项目 4.导入WpfAnim ...

最新文章

  1. 新闻发布系统类图_如何熟悉一个系统?(内含知识大图)
  2. 深圳部分写字楼租金暴跌,为何会出现这种情况?
  3. 【链接】Solr的Filed中indexed与stored属性
  4. linux文件管理服务,linux系统配置及服务管理_文件管理
  5. HDU-1233-还是畅通工程(最小生成树)
  6. 60. MySQLi 扩展拾遗
  7. php一键环境包xammp 安装 phpDocumentor
  8. java调用数据库的基本步骤_java数据库操作基本流程和技巧
  9. 笔记本键盘有几个键失灵了怎么办?
  10. [Wondgirl]从零开始学React Native之Text(五)
  11. 两台电脑之间串口传输文件
  12. 学生专用计算机怎么调时间,学生计算器怎么调时间
  13. for循环的auto用法
  14. 使用百度云盘快速下载文件
  15. 计算机英语wheel是什么意思,wheel是什么意思
  16. SQL存储过程根据,循环取出数据
  17. 创客机器人比赛简讯_“让思维沸腾,让创造先行”——记我校参加同安区首届创客大赛活动报道...
  18. vue-cli脚手架是什么及其脚手架搭建
  19. JAVA生成二维码扫码进入h5微信支付宝支付
  20. 微信小程序的简单介绍

热门文章

  1. pythonbool运算教学_python,_pandas Series bool与运算,python - phpStudy
  2. 三菱plc232数据线驱动下载_三菱PLC与西门子PLC有什么区别?
  3. python处在哪个阶段_python 基础复习
  4. iOS 命令行自动打包 (archive)
  5. 云计算开发要学习哪些东西?云计算开发的内容
  6. 学习 JavaScript (四)核心概念:操作符
  7. 从 Java 到 Scala(二):object
  8. 写一篇C语言入门第一讲
  9. aspx页面使用ajax遇到try catch中使用Response.End()报错
  10. HTML form 标签的 enctype 属性