wpf Listbox 实现按住ctrl键来取消选中
程序员文章站
2024-04-02 20:44:10
1. 首先继承一个listbox,来获得按住ctrl键时,点击的item 2 在listbox 的调用处: 获得listbox 的选中项:SelectedItemsList 3 在mouseleftdown事件里面添加处理程序 ......
1. 首先继承一个listbox,来获得按住ctrl键时,点击的item
public class listboxex : listbox
{
public beattemplatewave getanitem()
{
var obj = this.anchoritem;
if (obj != null)
{
type type = obj.gettype();
system.reflection.propertyinfo propertyinfo = type.getproperty("item", bindingflags.instance | bindingflags.nonpublic);
system.reflection.propertyinfo propertyinfo2 = type.getproperty("index", bindingflags.instance| bindingflags.nonpublic);
beattemplatewave value_old = (beattemplatewave)propertyinfo.getvalue(obj, null); //获取属性值
return value_old;
}
else
{
return null;
}
}
//重写选中 public void setlist(list<beattemplatewave> list) { this.setselecteditems(list); }
}
2 在listbox 的调用处: 获得listbox 的选中项:selecteditemslist
3 在mouseleftdown事件里面添加处理程序
private void mouseleftbuttonuphandler(elementmousebuttoneventmerge embem)
{
listboxex listbox = (embem.sender as listboxex);
if (keyboard.iskeydown(key.leftctrl) || keyboard.iskeydown(key.rightctrl))
{
list<beattemplatewave> selectlist = new list<beattemplatewave>();
var obj = (embem.sender as listboxnowheelex).getanitem();
if (selecteditemslist != null)
{
var templist = selecteditemslist.ilisttocollection<beattemplatewave>();
if (obj != null)
{
//判断鼠标点击的项在不在选中的里面,如果不在,则加入临时集合,如果在选中项里面,则不加入临时集合,
if (templist.any(p => p.r == obj.r))
{
foreach (beattemplatewave a in templist)
{
if (a.r == obj.r)
{
}
else
{
selectlist.add(a);
}
}
}
else
{
selectlist.add(obj);
selectlist.addrange(templist);
}
}
else
{
selectlist.addrange(templist);
}
listbox.setlist(selectlist); //重新选中
selecteditemslist = selectlist;//将临时集合赋值给选中项 重写选中
}
return;
}
else
{
if (listbox.selecteditems != null)
{
selecteditemslist = listbox.selecteditems;
var item = selecteditemslist;
if (item.count == 0)
return;
}
}
}