Отдельные «выбранные элементы» и «сфокусированный элемент» в WinForms ListView - PullRequest
1 голос
/ 05 марта 2010

Я хотел бы реализовать ListView , который будет иметь список SelectedItems , как сейчас, но он также будет иметь отдельный элемент, который находится под курсором (перемещается с помощью мыши / клавиатуры). Выбор элемента будет сделан специальным действием (например, клавиша пробела).

Другими словами, я хотел бы подавить выбор в ListView и изменять FocusedItem только тогда, когда выбор обычно происходит.

Я думаю, что я должен что-то сделать со свойствами ListView FocusedItem и SelectedItems , но дело в том, что нажатие на элемент выбирает его (также меняет фокус).

Решением было бы захватить нажатия клавиш и мышиных кликов событий, которые могут изменить выделение и только изменить FocusedItem на элемент в соответствии с событием (элемент под мышью) указатель в щелчке мыши и элемент выше / ниже текущего в keydown стрелка вверх / вниз). Тогда я только добавлю элементы в коллекцию SelectedItems для моего специального события (нажатие клавиши пробела).

Я спрашиваю, есть ли более элегантный подход к этой проблеме или решение, представленное выше, настолько простое, насколько это возможно. Спасибо

1 Ответ

0 голосов
/ 05 марта 2010

Хорошо, поцарапайте это.

Мне нужно было создать подкласс ListView (ListViewEx);

обрабатывать события выбора клавиатуры:

private void ListViewEx_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Down)
{
    //move focus down
    if (this.FocusedItem.Index + 1 < this.Items.Count)
    {
        this.FocusedItem = this.Items[this.FocusedItem.Index + 1];
        this.FocusedItem.EnsureVisible();
        e.Handled = true;
    }
}
else if (e.KeyData == Keys.Up)
{
    if (this.FocusedItem.Index - 1 < this.Items.Count)
    {
        this.FocusedItem = this.Items[this.FocusedItem.Index - 1];
        this.FocusedItem.EnsureVisible();
        e.Handled = true;
    }
}
}

и события мыши в WndProc

таким образом, щелчок левой кнопкой мыши / клавиатура вверх / вниз перемещает фокус, и щелчок правой кнопкой мыши делает выбор

protected override void WndProc(ref Message m)
{
    const int WM_LBUTTONDOWN = 0x0201;
    const int WM_RBUTTONDOWN = 0x204;
    switch (m.Msg)
    {
        case WM_LBUTTONDOWN:
            Point pos = this.PointToClient(Cursor.Position);
            var item = GetItemAt(pos.X, pos.Y);
            this.FocusedItem = item;
            break;
        case WM_RBUTTONDOWN:
            pos = this.PointToClient(Cursor.Position);
            item = GetItemAt(pos.X, pos.Y);
            item.Selected = !item.Selected;
            break;
        default:
            base.WndProc(ref m);
            break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...