WPF - создать строку нажатых клавиш, используя KeyDown в ListView - PullRequest
2 голосов
/ 22 сентября 2010

У меня есть список с дюжиной строк, привязанных к xml.Я хотел бы иметь возможность найти и поместить курсор на определенную запись.Например: у меня есть с этим ID, Имя, Значение:

1, Johny, Cash, USA
2, Jean-Michel, Jarre, France
3, Jeanette, , USA

Когда я наберу «Je», SelectedRow будет позиционироваться как ID 2. Когда я наберу «Jeane», SelectedRowбудет позиционироваться с идентификатором 3. Просто я хотел бы иметь возможность поиска и перейти к соответствующей записи в списке просмотра.Я начал создавать SearchString, и в этот момент я застрял:

Единственная возможность в WPF - использовать событие KeyDown.К сожалению, это событие возвращает некий ключ, который я не смог преобразовать в строку.Например, когда я нажимаю «A», SearchString будет «A».Когда я продолжу вводить «B», SearchString будет «AB» и т. Д. Когда SelectedItem изменяется, SearchString будет установлен в String.Empty.Нет KeyCode или другого полезного свойства / метода, доступного.

И вот идет потеря головы.Как я могу построить SearchString мне нужно?Когда я попробовал e.Key.ToString (), я получил действительно забавные строки - например, для 0 на Numpad я получаю ключ "Numpad0", для "," я получаю "OemComma" и т. Д. Я также пытался использовать метод TryParse для char, для ключа «3» я получаю значение «#» и т. д., он работает безупречно только для букв от А до Z, для других ключей TryParse возвращает false.

Единственный способ решить эту проблему -построить таблицу перевода с очень длинным видом "case e.Key.ToString ()":

"A": SearchString = SearchString + "A";
"System", SearchString = SearchString + " ";
"Numpad0", SearchString = SearchString + "0";
"ArrowUp", do nothing 

и т. д. и т. д. и т. п.

Нет ли более умного ипростой способ сделать это ??Или я просто не вижу деревья из-за леса?

1 Ответ

4 голосов
/ 22 сентября 2010

Вместо этого обрабатывайте PreviewTextInput. Справка: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/3fcfbe53-2c72-4fec-a997-dc881d1de72a.

EDIT:

Примечание: ListView (и ListBox также) внутренне обрабатывает событие KeyDown для некоторых клавиш для выбора и навигации. Ниже приведены ключи, которые внутренне обрабатываются ListView:

    Key.Space:
    Key.Return:
    Key.Prior:
    Key.Next:
    Key.End:
    Key.Home:
    Key.Left:
    Key.Up:
    Key.Right:
    Key.Down:

Key.Space представляет особый интерес, потому что при нажатии пробела в ListView событие PreviewTextInput не будет запущено. Таким образом, чтобы завершить ваше решение, вам также необходимо добавить обработчик для события ListView.PreviewKeyDown и проверить, была ли нажата клавиша пробела, чтобы добавить правильный текст пробела.

...