public void MouseDown(MouseEventArgs e) { /* * 如果按下的是鼠标右键 * 如果按在已选定的项上,只切换焦点,不改变选择 * 如果按在未选定项上,则切换为点的项为选中项 * 不考虑键盘按键 */ _mouseItemsAreaOffset = _itemsAreaOffset; List <ShengListViewItem> oldSelectedItems = _imageListView.GetSelectedItems(); ShengListViewHitInfo hitInfo = HitTest(e.Location); if (hitInfo.ItemHit) { ShengListViewItem item = _imageListView.Items[hitInfo.ItemIndex]; List <ShengListViewItem> allItems = _imageListView.Items.ToList(); ShengListViewItem currentFocusedItem = _imageListView.FocusedItem; if (_imageListView.LeftButton) { #region 如果不允许多选 if (_imageListView.AllowMultiSelection == false) { //如果点击的项就是当前选择的项 if (oldSelectedItems.Count > 0 && oldSelectedItems.Contains(item)) { //判断Control键是否按下,如果按下了Control键,取消当前项的选择状态 if (_imageListView.ControlKey) { item.Selected = false; } } else { //如果点击的项不是当前选择的项 //清除原选定项的选定状态 _imageListView.ClearSelect(); //设置新项为选定项 item.Selected = true; } } #endregion #region 如果允许多选 //在同时按下 Control 和 Shift 的情况下,优先考虑 Shift else { #region 如果按下 Shift //判断是否按下了 Shift ,如果按下 Shift,不考虑 Control 的状态 //也不用考虑是否点击的项是否是现有选定项之一 if (_imageListView.ShiftKey) { //如果当前存在具有输入焦点的项 if (currentFocusedItem != null && currentFocusedItem != item) { //连续选中从当前具有焦点的项至点击的项之间的所有项 //并将不在此范围内的项取消选中状态 int startIndex = Math.Min(currentFocusedItem.Index, hitInfo.ItemIndex); int endIndex = Math.Max(currentFocusedItem.Index, hitInfo.ItemIndex); foreach (var i in from c in oldSelectedItems where c.Index <startIndex || c.Index> endIndex select c) { i.Selected = false; } for (int i = startIndex; i <= endIndex; i++) { ShengListViewItem eachItem = allItems[i]; if (eachItem.Selected == false) { eachItem.Selected = true; } } } //如果当前不存在具有输入焦点的项 else { //清除原选定项的选定状态 _imageListView.ClearSelect(); item.Selected = true; } } #endregion #region 如果 Shift键没有处于按下状态 else { #region 如果点击的项 是 当前选择的项之一 if (oldSelectedItems.Count > 0 && oldSelectedItems.Contains(item)) { //判断是否按下了 Control,且没有按下 Shift if (_imageListView.ControlKey && _imageListView.ShiftKey == false) { item.Selected = false; } //判断是否什么键都没有按下 if (_imageListView.ControlKey == false && _imageListView.ShiftKey == false) { //清除原选定项的选定状态 _imageListView.ClearSelect(); item.Selected = true; } } #endregion #region 如果点击的项 不是 当前选择的项之一 else { //判断Control键是否按下,如果按下了Control键,则保持原有选择的情况把新项也设置为选中 //否则清除当前选择 if (_imageListView.ControlKey == false) { //清除原选定项的选定状态 _imageListView.ClearSelect(); } item.Selected = true; } #endregion } #endregion } #endregion } else { //如果点在未选中的项上 if (oldSelectedItems.Contains(item) == false) { _imageListView.ClearSelect(); //设置新项为选定项 item.Selected = true; } } #region 为项设置输入焦点 //设置新的输入焦点要放在后面处理,因为在使用Shift连续选择时,需要用到原具有焦点的项 if (currentFocusedItem == null || (currentFocusedItem != null && currentFocusedItem != item)) { if (currentFocusedItem != null) { currentFocusedItem.Focused = false; } item.Focused = true; } #endregion } else { _imageListView.ClearSelect(); } List <ShengListViewItem> newSelectedItems = _imageListView.GetSelectedItems(); if (oldSelectedItems.SequenceEqual(newSelectedItems) == false) { _imageListView.NeedPaint(); _imageListView.OnSelectedItemChanged(); } }