Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как поймать событие нажатие клавиш стрелочек? / 9 сообщений из 9, страница 1 из 1
02.02.2011, 10:04
    #37092305
.Anatoly.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поймать событие нажатие клавиш стрелочек?
Есть небольшое WPF приложение.
Хочется между элементами формы перемещаться по нажатию клавиш Left/Right/Down/Up.
Событие KeyDown отлавливает буквы, цифры, даже Enter, но не стрелочки.
Есть элемент KeyboardNavigation, но в нем все заточено для использования Таба.

Как решить такую задачу?
Заранее спасибо
...
Рейтинг: 0 / 0
02.02.2011, 13:53
    #37093048
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поймать событие нажатие клавиш стрелочек?
наверное правильней использовать событие PreviewKeyDown, чтобы аккуратно "прибить" (e.Handled = true), наверное по этой причине PreviewKeyDown "видит" все, а KeyDown лишь "полезное" (без навигации и т.п.)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
        private void textBox1_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Down) {
                textBox2.Focus();
                e.Handled = true;
            }
        }
...
Рейтинг: 0 / 0
02.02.2011, 14:24
    #37093128
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поймать событие нажатие клавиш стрелочек?
и, кстати
Routed Events Overview
msdnRouted events use one of three routing strategies:

Bubbling: Event handlers on the event source are invoked. The routed event then routes to successive parent elements until reaching the element tree root. Most routed events use the bubbling routing strategy. Bubbling routed events are generally used to report input or state changes from distinct controls or other UI elements.

Direct: Only the source element itself is given the opportunity to invoke handlers in response. This is analogous to the "routing" that Windows Forms uses for events. However, unlike a standard CLR event, direct routed events support class handling (class handling is explained in an upcoming section) and can be used by EventSetter and EventTrigger.

Tunneling: Initially, event handlers at the element tree root are invoked. The routed event then travels a route through successive child elements along the route, towards the node element that is the routed event source (the element that raised the routed event). Tunneling routed events are often used or handled as part of the compositing for a control, such that events from composite parts can be deliberately suppressed or replaced by events that are specific to the complete control. Input events provided in WPF often come implemented as a tunneling/bubbling pair. Tunneling events are also sometimes referred to as Preview events, because of a naming convention that is used for the pairs.
т.е., для "Хочется между элементами формы перемещаться по нажатию клавиш Left/Right/Down/Up" конечно же выгодней использовать Tunneling events (обрабатывать на уровне родителя - формы)
...
Рейтинг: 0 / 0
02.02.2011, 14:41
    #37093182
dmitry_ie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поймать событие нажатие клавиш стрелочек?
Правильный способ сделать это - использовать ComponentCommands, например, ComponentCommands.MoveLeft уже имеет предопределенный InputBinding для стрелки влево. ComponentCommands.ExtendSelectionLeft имеет преопределнный инпут байндинг на Shift + Left arrow
...
Рейтинг: 0 / 0
07.02.2011, 11:17
    #37101705
koJIo6ok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поймать событие нажатие клавиш стрелочек?
.Anatoly.,
не знаю правильно или нет я себе сделал так, теперь гляну вар предложенный dmitry_ie
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
protected override void OnPreviewKeyDown(KeyEventArgs e)
        {
            base.OnPreviewKeyDown(e);

            if (e.Key == Key.Down || e.Key == Key.Up)
            {
                FocusNavigationDirection focusDirection = FocusNavigationDirection.First;
                switch (e.Key)
                {
                    case Key.Down:
                        focusDirection = FocusNavigationDirection.Next;
                        break;
                    case Key.Up:
                        focusDirection = FocusNavigationDirection.Previous;
                        break;
                }
                TraversalRequest request = new TraversalRequest(focusDirection);
                UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;
                if (elementWithFocus != null)
                {
                    elementWithFocus.MoveFocus(request);
                }
                ComboBox cmb = e.Source as ComboBox;
                {
                    if (cmb != null)
                    {
                        if (cmb.IsDropDownOpen == false)
                        {
                            e.Handled = true;
                        }
                    }
                    else
                    {
                        e.Handled = true;
                    }
                }
            }
            else if (e.Key == Key.Enter)
            {
                TextBox txt = e.Source as TextBox;
                if (txt != null)
                {
                    if (txt.Tag == null)
                    {
                        FocusNavigationDirection focusDirection = FocusNavigationDirection.Next;
                        TraversalRequest request = new TraversalRequest(focusDirection);
                        UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;
                        if (elementWithFocus != null)
                        {
                            elementWithFocus.MoveFocus(request);
                        }
                        e.Handled = true;
                    }
                }
            }
        }
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
15.07.2012, 00:42
    #37879617
_nautilus_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поймать событие нажатие клавиш стрелочек?
Доброго дня.
У меня аналогичная проблема - есть компонент, в нем TextBox и нужно отлавливать для него нажатия стрелочек. this.PreviewKeyDown стрелки не ловит. Пока работает с помощью стрелок Num Lock, но хотелось бы все-таки как-то отловить основные стрелки. Может быть кто-нибудь подскажет как именно?
Спасибо.
...
Рейтинг: 0 / 0
18.07.2012, 18:50
    #37884374
_nautilus_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поймать событие нажатие клавиш стрелочек?
Неужели никто не знает?
...
Рейтинг: 0 / 0
16.08.2012, 00:04
    #37918530
_nautilus_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поймать событие нажатие клавиш стрелочек?
Странно, но теперь стрелочки внезапно заработали. То, что разрешилось - это, конечно, хорошо, но непонятно почему - это вряд ли здорово...
...
Рейтинг: 0 / 0
22.08.2012, 03:10
    #37925486
_nautilus_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как поймать событие нажатие клавиш стрелочек?
Если проект собрать при x64/Any - стрелочки не работают. При x86 работают.
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как поймать событие нажатие клавиш стрелочек? / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]