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;
			}
		}

 

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