У меня есть ListView со свойством CheckBoxes
, установленным на true
, и со следующим обработчиком событий:
private void listView1_ItemCheck(object sender, ItemCheckEventArgs e)
{
listView1.Items[e.Index].Selected = e.NewValue == CheckState.Checked ? true : false;
}
Использование клавиатуры:
Я могу переместить выделение влево или вправо с помощью клавиш со стрелками и (не) проверить элемент с помощью клавиши пробела. Я могу выбрать несколько элементов, используя клавиши Shift + стрелка.
Проблема: при нажатии клавиши пробела для снятия флажка с одного из отмеченных элементов выбор автоматически устанавливается на один элемент, который в данный момент находится в фокусе.
Использование мыши:
Элементы выбора и отмеченные элементы, кажется, синхронизированы, пока я не проверю два элемента, а затем не нажму левой кнопкой мыши на одном из их двух флажков, в тот момент, когда выбор будет отменен, а все отмеченные элементы станут непроверенными.
Пример снимков экрана:
Исходное состояние:
![Initial state](https://i.stack.imgur.com/Z4ekL.png)
, затем после щелчка левой кнопкой мыши на первом флажке и затем левой кнопкой мыши на втором флажке:
![State 2](https://i.stack.imgur.com/xOEdf.png)
затем после щелчка левой кнопкой мыши на любом из двух флажков, снова начальное состояние:
![Initial state again](https://i.stack.imgur.com/Z4ekL.png)
Ожидаемое поведение : один из двух флажков (тот, который не был нажат на последнем шаге) должен оставаться отмеченным и выбранным.
Примечание: Я хочу иметь возможность использовать и другие виды ListView, свойство LabelEdit, перетаскивание, значки, мультиселектор, группы.
Я думал о возможности узнать координаты прямоугольника флажка и использовать событие MouseDown, или даже нарисовать мои собственные флажки, но, возможно, есть более простой или лучший способ.
Обновление 1 :
В проводнике файлов в проводнике Windows 10 я могу включить функцию, которая делает это возможным:
![Windows 10 File Explorer screenshot 1](https://i.stack.imgur.com/YiEcU.png)
Здесь первая папка (скрытая папка) не отмечена и не выбрана, а второй и третий элементы выбираются либо с помощью флажка, либо с помощью нажатия Ctrl +, либо с помощью обоих.
Еще один скриншот:
![Windows 10 File Explorer screenshot 2](https://i.stack.imgur.com/mMbTI.png)
Я считаю разделение флажков и выбор ненужным, я думаю, что для пользователя более интуитивно понятно, если они объединены.
Я пытаюсь использовать выбор, а также флажки для выбора групп / папок для отображения в моем приложении.
Обновление 2: О коде, размещенном в этот связанный вопрос :
В этом коде есть несколько ошибок, одна из которых следующая:
Шаги для воспроизведения:
- Измените код конструктора, добавив всего 5 элементов в ListView.
- При запуске программы фокусируется первый элемент (не выбран и не отмечен).
- Нажатие клавиши со стрелкой вправо перемещает фокус на второй элемент.
- Когда я держу нажатой клавишу Shift и нажимаю правую клавишу со стрелкой, поведение оказывается неправильным: второй и третий элементы выбираются и проверяются, а после повторного нажатия стрелки вправо при нажатой клавише Shift только
item3
и item4
получить выбор - точнее item2
и item3
проверяются, а item3
и item4
выбираются. Отпускание клавиши Shift и нажатие в пустом месте делает только отмеченный item3
, и ни один не выбран.
В ответе Алексы Ристик есть несколько ошибок:
- двойной щелчок на ярлыке проверяет / снимает отметку, и состояние выбора противоположное;
- При выборе резиновой ленты флажки не установлены;
- после выбора элемента, нажав на ярлык и отметив, что он отменен.
Обновление 3 :
В ответе Алексы Ристик все еще есть ошибки, теперь я их вижу:
Я запускаю программу, затем я либо:
- непосредственно нажмите на ярлык или флажок;
- переместить фокус с помощью клавиш со стрелками;
- нажмите пробел или попробуйте выбор Shift;
и я всегда получаю System.StackOverflowException
на одной строке i.Selected = false;
(около строки 85).
Когда пользователь щелкает все и отменяет выделение, я хотел бы выделить выделенные и отмеченные элементы жирным шрифтом, а когда пользователь щелкает все, выделенные элементы и отмеченные элементы очищаются.
Когда пользователь нажимает на ярлык, мне бы хотелось, чтобы он работал так же, как когда он нажимал на флажок рядом с ярлыком.
Резиновая лента теперь работает очень хорошо.