WPF ListBox
记录一些ListBox的用法
- 设置ListBox选中项的背景颜色
- 如何为标准的ListBox添加ItemClick事件
- 连续选择同一项时SelectionChanged 事件不响应的问题
1.设置ListBox选中项的背景颜色
- 采用模板
先看一下效果图:
在设置listbox选中样式是遇到一个问题:选中项的背景设置不起作用
经过一段时间的挣扎后找到原因,模板里的控件要设置 Background="{TemplateBinding Background}" TextBlock.Foreground="{TemplateBinding Foreground}"否则背景是不会变化的。
- <ListBox Name="list" ItemsSource="{Binding InfoList}">
- <ListBox.ItemContainerStyle>
- <Style TargetType="ListBoxItem">
- <!-- 设置控件模板 -->
- <Setter Property="Template">
- <Setter.Value>
- <ControlTemplate TargetType="ListBoxItem">
- <Grid>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width=""/>
- <ColumnDefinition Width="*"/>
- <ColumnDefinition Width="auto"/>
- </Grid.ColumnDefinitions>
- <TextBlock Text="{Binding Num}" Grid.Column=""/>
- <TextBlock Text="{Binding Name}" Grid.Column="" Background="{TemplateBinding Background}" TextBlock.Foreground="{TemplateBinding Foreground}"/>
- <TextBlock Text="{Binding Sex}" Grid.Column=""/>
- </Grid>
- </ControlTemplate>
- </Setter.Value>
- </Setter>
- <!-- 设置触发器 -->
- <Style.Triggers>
- <Trigger Property="IsSelected" Value="true">
- <Setter Property="Background" Value="#64BCEA"/>
- </Trigger>
- <Trigger Property="IsMouseOver" Value="true">
- <Setter Property="Background" Value="#C7DEEA"/>
- <!--<Setter Property="Foreground" Value="Red"/>-->
- </Trigger>
- </Style.Triggers>
- </Style>
- </ListBox.ItemContainerStyle>
- </ListBox>
设置中间列有效果
- <ListBox Name="list" ItemsSource="{Binding InfoList}">
- <ListBox.ItemContainerStyle>
- <Style TargetType="ListBoxItem">
- <!-- 设置控件模板 -->
- <Setter Property="Template">
- <Setter.Value>
- <ControlTemplate TargetType="ListBoxItem">
- <Grid Background="{TemplateBinding Background}" TextBlock.Foreground="{TemplateBinding Foreground}">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width=""/>
- <ColumnDefinition Width="*"/>
- <ColumnDefinition Width="auto"/>
- </Grid.ColumnDefinitions>
- <TextBlock Text="{Binding Num}" Grid.Column=""/>
- <TextBlock Text="{Binding Name}" Grid.Column=""/>
- <TextBlock Text="{Binding Sex}" Grid.Column=""/>
- </Grid>
- </ControlTemplate>
- </Setter.Value>
- </Setter>
- <!-- 设置触发器 -->
- <Style.Triggers>
- <Trigger Property="IsSelected" Value="true">
- <Setter Property="Background" Value="#64BCEA"/>
- </Trigger>
- <Trigger Property="IsMouseOver" Value="true">
- <Setter Property="Background" Value="#C7DEEA"/>
- <!--<Setter Property="Foreground" Value="Red"/>-->
- </Trigger>
- </Style.Triggers>
- </Style>
- </ListBox.ItemContainerStyle>
- </ListBox>
设置整个ListBoxItem有效果
里面我用到的布局控件为“Grid”简单点的还可以用“Border”等控件。
- 自定义SystemColors类的参数
SystemColors的HighlightBrushKey和HighlightTextBrushKey分别代表ListBoxItem被选中时文字和背景颜色,没有Highlight的BrushKey代表ListBox没有焦点时的选中项文字和背景颜色。
效果图:
- <ListBox>
- <ListBox.Resources>
- <Style TargetType="ListBoxItem">
- <Style.Resources>
- <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Pink"/>
- <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Gray"/>
- <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Red"/>
- <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Green"/>
- </Style.Resources>
- </Style>
- </ListBox.Resources>
- <ListBoxItem>AAA</ListBoxItem>
- <ListBoxItem>B</ListBoxItem>
- <ListBoxItem>ccc</ListBoxItem>
- </ListBox>
代码示例
这是在网上其他人的博客里看到的,我没有详细去做。
2.如何为标准的ListBox添加ItemClick事件
- public class MyListBox:ListBox
- {
- private static readonly object EventItemClick = new object();
- public event EventHandler<ListBoxItemEventArgs> ItemClick
- {
- add
- {
- Events.AddHandler(EventItemClick, value);
- }
- remove
- {
- Events.RemoveHandler(EventItemClick, value);
- }
- }
- protected virtual void OnItemClick(ListBoxItemEventArgs e)
- {
- EventHandler<ListBoxItemEventArgs> handler = (EventHandler<ListBoxItemEventArgs>)this.Events[EventItemClick];
- if (handler != null)
- {
- handler(this, e);
- }
- }
- protected override void OnClick(EventArgs e)
- {
- base.OnClick(e);
- for (int i = ; i < this.Items.Count; i++)
- {
- bool flag = this.GetItemRectangle(i).Contains(this.PointToClient(Control.MousePosition));
- if (flag)
- {
- ListBoxItemEventArgs args = new ListBoxItemEventArgs(i);
- OnItemClick(args);
- break;
- }
- }
- }
- }
- public class ListBoxItemEventArgs : EventArgs
- {
- private int _listBoxItem;
- public ListBoxItemEventArgs(int listBoxItem)
- {
- _listBoxItem = listBoxItem;
- }
- public int ListBoxItem
- {
- get
- {
- return _listBoxItem;
- }
- }
- }
3.连续选择同一项时SelectionChanged 事件不响应的问题
- 简单点的方式
处理SelectionChanged当操作结束后把SelectedIndex设为-1;
- private void lBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- if (lBox.SelectedIndex == -)
- {
- return;
- }
- // 这里填写所需要处理的代码
- lBox.SelectedIndex = -;
- }
- 复杂点就是重载OnSelect()
这不局限与ListBox,TreeView等都可以参考
- public class myListBox : System.Windows.Controls.ListBox
- {
- protected override DependencyObject GetContainerForItemOverride()
- {
- return new myListBoxItem();
- }
- }
- public class myListBoxItem : System.Windows.Controls.ListBoxItem
- {
- protected override void OnSelected(System.Windows.RoutedEventArgs e)
- {
- DependencyObject dep = (DependencyObject)e.OriginalSource;
- while ((dep != null) && !(dep is ListBoxItem))
- {
- dep = VisualTreeHelper.GetParent(dep);
- }
- if (dep == null)
- return;
- ListBoxItem item = (ListBoxItem)dep;
- if (item.IsSelected)
- {
- item.IsSelected = !item.IsSelected;
- //e.Handled = true;
- }
- base.OnSelected(e);
- }
- }
这是我在一个博客上转载的,不过当时放在有道云笔记中,作者的地址已经丢失,在此对这位博主表示歉意。
WPF ListBox的更多相关文章
- 自定义WPF ListBox的选中项样式
首先介绍一种简单地方法:就是通过自定义SystemColors类的参数来自定义WPF ListBox选择颜色的,SystemColors的HighlightBrushKey和HighlightText ...
- WPF ListBox数据绑定
本文来源 http://wshoufeng1989.blog.163.com/blog/static/202047033201282911633670/ 风随影动的博客 使用数据库AllData , ...
- WPF : ListBox的几种Template属性
原文:WPF : ListBox的几种Template属性 属性名 属性的类名 功能 示例 Template ControlTemplate 定义控件自身的外观.其子元素的布局可以自定义,也可以由It ...
- 自定义WPF ListBox的选择样式
(下图:进行多项选择的ListBox) 首先介绍一种简单地方法:就是通过自定义SystemColors类的参数来自定义WPF ListBox选择颜色的,SystemColors的HighlightBr ...
- wpf listbox 选中项 上移下移
原文:wpf listbox 选中项 上移下移 private void MoveUp_Click(object sender, RoutedEventArgs e) { ...
- WPF ListBox 横向排列
WPF ListBox 横向排列 如果只是单纯的让ListBox可以横向配列,这样很简单,只需要更改ListBox的ItemsPanel模板就可以,例如: <ListBox><L ...
- Wpf ListBox数据绑定实例1--绑定字典集合
1.使用ListBox绑定Dictionary字典数据 ListBox常用事件SelectionChanged private void bindListBox() { Dictionary<s ...
- WPF ListBox/ListView/DataGrid 虚拟化时的滚动方式
ListBox的滚动方式 分为像素滚动和列表项滚动 通过ListBox的附加属性ScrollViewer.CanContentScroll来设置.因此ListBox的默认模板中,含有ScrollVie ...
- WPF ListBox ItemContainerStyle 设置BackGround 和 BorderBrush 无效
今天更改ListBox,用到ItemContainerStyle设置样式,设置Style.Triggers时,BackGround和BorderBrush均无效,其他效果正常. 翻看WPF编程宝典,发 ...
随机推荐
- MySQL设置字符集为UTF8(Windows版)
Windows版MySQL设置字符集全部为utf8的方式 MySQL安装目录下的my.ini文件 [client]节点 default-character-set=utf8 (增加) [mysq ...
- 如何理解meta标签
相信大家对meta标签都不陌生,但是打开某些网页源代码看到一堆的meta难免一脸蒙逼.废话少说,请大家更随我一起探索meta标签都有哪些属性以及作用. W3C给meta标签的定义是:<meta& ...
- sumoselect插件
由于项目需要,研究了下sumoselect插件,接下来简单介绍下sumoselect. 在百度上搜索“sumoselect.js”,查到的网页基本上都有对sumoselect的基本介绍,如下: 简单介 ...
- C#基础——系统登录功能的实现
一般的登陆界面,都是利用用户名和密码在数据库的匹配关系,来实现登陆的跳转功能. 首先介绍用户数据表的设计. 其中ID列需要设置好增量标识,随着用户的增加,ID的值递增,避免重复. 然后是C#中对数据库 ...
- RBM阅读笔记
RBM包含两个层,可见层(visble layer)和隐藏层(hidden layer).神经元之间的连接具有以下特点:层内无连接,层间全连接.RBM可以看做是一个二分图(神经元当做顶点,神经元之间的 ...
- Android之ProgressBar初步应用
这里利用 ProgressBar 即时显示下载进度. 途中碰到的问题: 1.主线程中不能打开 URL,和只能在主线程中使用 Toast 等 2.子线程不能修改 UI 3.允许网络协议 4.暂停下载和继 ...
- 4-Spark高级数据分析-第四章 用决策树算法预测森林植被
预测是非常困难的,更别提预测未来. 4.1 回归简介 随着现代机器学习和数据科学的出现,我们依旧把从“某些值”预测“另外某个值”的思想称为回归.回归是预测一个数值型数量,比如大小.收入和温度,而分类则 ...
- div各种距离 详细解释图
详细博文介绍:http://blog.csdn.net/fswan/article/details/17238933
- C++ STL泛型编程——在ACM中的运用
学习过C++的朋友们应该对STL和泛型编程这两个名词不会陌生.两者之间的关系不言而喻,泛型编程的思想促使了STL的诞生,而STL则很好地体现了泛型编程这种思想.这次想简单说一下STL在ACM中的一些应 ...
- DMA控制器
DMA控制器依赖于平台硬件,这里只对i386的8237 DMA控制器做简单的说明,它有两个控制器,8个通道,具体说明如下: 控制器1: 通道0-3,字节操作, 端口为 00-1F 控制器2: 通道 4 ...