wpf Listbox 实现按住ctrl键来取消选中

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;

                }
            }

        }

  

原文地址:https://www.cnblogs.com/gisbeginner/p/10096906.html

时间: 2024-11-10 11:53:30

wpf Listbox 实现按住ctrl键来取消选中的相关文章

Q键连发。按住Q键则连发。松开则停止1。

Q键连发.按住Q键则连发.松开则停止1.  1楼. 检测 按键按下,则允许某一段后台程序开始执行. 2楼. 获得后台输入窗口的 Hwnd. 子窗口要取子窗口的Hwnd.DX软件绘图的窗口,要用DX按键模式. . 用API函数, ret = GetAsyncKeyState(81)来检测. 可以这样简单理解, ret 小于 -1,则为按住. ret 大于 -1,则不是按住. . 检测到Q键按下,则循环开关=1,允许某一段后台程序开始执行. 检测到Q键弹起,循环开关=0,结束某一段后台程序的执行.

ubuntu下将CapsLock改为Ctrl键

需求:Ubuntu下用Vim时,ESC因为在左上角,还算是好按,但是Ctrl就太坑了,在左右两个下角,实在是太不方便了. 经过分析决定将:CapsLock键改为Ctrl,但仍然保留下面的原Ctrl键(使用Ctrl+Space来切换输入法,已经习惯了,不想换). 简单的说,就是用Ctrl替换CapsLock键. 方法: 1.编辑keyboard文件. sudo vim /etc/default/keyboard 2.该文件默认为这个样子: # KEYBOARD CONFIGURATION FILE

见鬼的ctrl键坏了

真是见鬼吧 在我百度加雅虎,就差不能google,并且纠结郁闷了好几天之后,我突然发呆的想了想. 突然动了动,难道是键坏了. 于是我试试右ctrl键--- 然后我就喷了——不怕你笑话,我真的喷口水了. 妈的! 我说,怎么windows下也废了,ubuntu下也废了?! 刚试图拆开按键盖,发现没啥卡住——卡住我是能感到的,那个东西拔了拔,也没拔出什么名堂. 今晚就这样吧!睡觉了!睡不着就看小说,总之不要对着电脑屏幕!! 也不必太在乎什么今晚没有写手机DIY程序,反正,这还得换硬盘呢........

用AutoHotKey彻底解决“Ctrl键+鼠标滚动”时的缩放问题

“Ctrl键+鼠标滚动”会造成代码编辑窗口的字体缩放,这是自Visual Studio 2010以来引入的一个新特性,也是一个恼人的问题,详见VS2010中尴尬的代码窗口缩放功能. 于是,每次安装Visual Studio,首先安装的插件就是 Disable Mouse Wheel Zoom ,禁用这个特性. 但是,最近在用Visual Studio 2015 Preview,这个插件还不支持VS 2015,不得不饱受这个问题的折磨.今天(12月10日)实在忍无可忍,下定决心解决这个问题. 后来

[Selenium]如何通过Selenium实现Ctrl+click,即按住Ctrl的同时进行单击操作

在自动化测试的过程中,经常会出现这样的场景: 按住Ctrl的同时,进行单击操作,已达到多选的目的 Actions a = new Actions(driver); a.keyDown(Keys.CONTROL).perform(); for(int i = 0;i<quantity;i++){ WebElement securityEl = securitiesList.get(i); SeleniumUtil.scrollIntoView(driver, securityEl); securi

mxGraph实现按住ctrl键盘拖动图形实现复制图形功能

实现这个功能非常简单,只需要重写moveCells方法就可以了.下面是源文件中的代码: mxGraph.prototype.moveCells = function(cells, dx, dy, clone, target, evt) { if (cells != null && (dx != 0 || dy != 0 || clone || target != null)) { this.model.beginUpdate(); try { if (clone) { cells = th

萝卜家园Win10系统怎么用Ctrl键来切换中英文输入法

在萝卜家园win10特别版系统中,切换英文输入法是shift+空格键,但是有些用户不喜欢用这样切换方式,那么小编教大家用Ctrl键来切换英文输入法吧! 1.点击"开始菜单",选择"设置"选项.如图1所示 图1 2.在"设置"界面中,点击"时间和语言"图标.如图2所示 图2 3.在"时间和语言"界面中,点击左侧的"区域和语言",在右侧的语言选项下,点击"中文Windows显示语言

WPF listbox的分组研究

1. 初探GroupItem对象 2.ContainerStyle 与 GroupItem的绑定对象 3.Grouping 级联 WPF listbox的分组研究

iOS 按住Home键的代理

1.按住home键怎么保存程序的运行状态: 监听按home键的时候程序挂起的状态(通知),然后让其重新进入程序[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:)name:UIApplicationWillResignActiveNotification object:nil]; 2.当程序运行时 按下home键 iOS会调用哪个代理: .-