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编程宝典,发 ...
随机推荐
- win10 64位 mysql安装
一.安装mysql 1.下载mysql-5.7.15-winx64.zip http://dev.mysql.com/downloads/mysql/ 2.解压缩到D:\ProgramFiles 3. ...
- LayaAir引擎——(五)
LayaAir引擎——关于地图详解 所需要的软件: LayaAirIDE1.0.2版本 在LayaAir引擎中与地图相关的类: 1.laya.map.TiledMap TiledMap类 地图以层 ...
- java 集合:实现
集合本来就是为了方便开发的,实现了一些基本数据结构,一般来说数据结构有两种物理的实现:数组和链表.数组是连续的空间,链表是不连续的.基于这两种又扩展了很多的数据结构.队列,栈,hash表,树. 在ja ...
- libev学习(一)
一.libev简介 Libev是一个事件循环:你注册感兴趣的特定事件(比如一个文件可以读取时或者发生超时时),它将管理这些事件源,将这些事件反馈给你的程序.为了实现这些,至少要在你的进程(或线程)中执 ...
- js或者ext js获取返回值
由于前台业务需要在判断中发起ajax到后台,根据返回值校验是否通过 代码如下 关键点在于要将async关闭 设置成同步,这样才能接收到要返回的flag ...
- 解决织梦DEDEcms指定arclist的特定ID排序的方法
转载网址:http://blog.hrseo.net/xuexi/184.html 替换/include/taglib/arclist.lib.php这个文件,下载链接: http://pan.bai ...
- [读书笔记]自动装箱的陷阱以及==与equals
先看一段代码,来自周志明的<深入理解Java虚拟机>. Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Intege ...
- JavaScript侧边悬浮框
<script> window.onscroll=function(){ var oDiv=document.getElementById('div1'); var scrollTop=d ...
- easyui datagrid 合并单元格
整理以前做的东西,这个合并单元格的问题再新浪博客也写过了..... 下面这段代码是列表数据 //载入排放系数管理报表数据 function LoadEmissionReportData() { //获 ...
- MySQL字符串处理函数的几种常见用法
1.字符串大小写转化: (1).将tbl_student表的user_name字段所有小写字母,替换为大写: update tbl_student set user_name=UPPER(user_n ...