WPF ListView 实现按住【Ctrl】键进行多选

WPF 自带的ListView是支持多选的,在属性 SelectionMode 中可以进行设置。但是会有这样一个困扰,就是当我每次点击一个ListViewItem的时候,都会选中,这样就相当于只能多选不能单选。正常我们的逻辑都是按住【Ctrl】按键的时候能够进行多选,而其他情况下都是单选的。可以考虑下面的解决方案:

 

首先,给ListView建立一个 KeyDown 的事件,监测键盘中的按键情况,当按下【Ctrl】的时候,将 ListView 的选择模式属性【SelectionModel】修改为多选;

然后给ListView 建立一个 KeyUp 事件,判断当【Ctrl】按键松开的时候,再将 ListView 的选择模式【SelectionModel】设置回单选;

 

但是这样也会有一个问题,因为在设置回单选模式后,多选选中的都会消失,只保留最开始选中的那一条,这样不合理呀。

 

怎么办呢?如果 KeyUp 的时候不设置回单选,而是设置一个标志,表示【Ctrl】按键已经松开,然后在下次 ListView 点击的时候设置为单选。

嗯嗯,试了一下确实可行。但是有一个小问题,就是我点击了另一个 Item,假设是9号item吧,之前按住【Ctrl】选中了6,7,8号item,我希望在松开【Ctrl】之后,点击9号,能够将6,7,8都不选,选中9号,但是现在情况就是,9号不会被选中,而是6号被选中,这个选中的item就是按住【Ctrl】的时候第一个被选中的item。

 

但是我们就是想让9号选中呀,那就在多加一行判断,将最后的9号设置为 SelectedItem。

 

代码如下:

 


        private bool bCtrl = false;

		//按键按下事件,监测【Ctrl】
		private void TestLv_OnKeyDown(object sender, KeyEventArgs e)
		{
			if (e.Key == Key.LeftCtrl)
			{
				this.testLv.SelectionMode = SelectionMode.Multiple;
				bCtrl = true;

			}
			else
			{
				this.testLv.SelectionMode = SelectionMode.Single;
			}
		}
		
		//按键松开,将状态置回
		private void TestLv_OnKeyUp(object sender, KeyEventArgs e)
		{
			bCtrl = false;
		}
		
		//选中事件,对状态进行判断,然后设置回单选模式
		private void TestLv_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
		{
			if (!bCtrl)
			{
				this.testLv.SelectedItem = this.testLv.SelectedItems[this.testLv.SelectedItems.Count - 1];
				this.testLv.SelectionMode = SelectionMode.Single;
			}
		}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章