Работа с клавиатурой в игре на основе XAML для Windows 8

Я создаю игру для Магазина Windows, используя C# и XAML. Все мои игровые объекты имеют холст, описывающий их вид. Эти холсты будут отображаться в холсте (gameRoot).

Я хочу переместить своего игрока в зависимости от того, какую клавишу он нажал (например, W идет вверх). Вот моя страница отображения:

<Page
x:Class="Labyrinth_XAML.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Labyrinth_XAML"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Canvas x:Name="gameRoot"  KeyDown="gameRoot_KeyDown_1">
    <Button>Vakanu</Button>
</Canvas>


</Page>

Я создал точку останова в своем обработчике событий, и событие KeyDown никогда не срабатывает. После некоторого поиска в Google я понял, что если я создам кнопку в своем Canvas, событие сработает. Но если я удалю, событие не сработает. Если я нажму в любом месте кнопки, событие больше никогда не сработает.

Мой вопрос: как я могу создать обработчик событий клавиатуры, который срабатывает каждый раз, когда я нажимаю клавишу на странице, независимо от того, какой элемент имеет фокус?


person Gábor Apagyi    schedule 01.10.2012    source источник


Ответы (3)


Вы можете подписаться на события Window.Current.CoreWindow.KeyDown/Up.

person Filip Skakun    schedule 01.10.2012
comment
+1. Да, перехват ключевых событий глобально, а не привязка к конкретному элементу управления, больше подходит для игр. Обратите внимание, однако, что обработка событий в WPF и WinForms позволяет вам одновременно перехватывать только одно событие нажатия клавиши или мыши. Игровые интерфейсы, такие как Direct X, позволяют одновременно нажимать (и ловить) несколько клавиш клавиатуры и мыши. - person Olivier Jacot-Descombes; 01.10.2012

Если вы хотите обрабатывать события нажатия клавиш на всей странице, независимо от фокуса. Добавьте этот код С# в свой конструктор:

Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown;

Это подпишет вас на любое событие keyDown, которое происходит на странице. И, конечно же, добавьте обработчик:

void CoreWindow_KeyDown(Windows.UI.Core.CoreWindow sender,     Windows.UI.Core.KeyEventArgs args)
    {
        //Do Something Here.

    }

Вы можете сделать то же самое для события KeyUp.

person Misty Glotfelter    schedule 10.09.2015

Некоторое время назад боролся с похожей проблемой. Вы должны установить для свойства "Focusable" вашего холста значение true. Чтобы сфокусировать холст, вам нужно будет вызвать функцию Focus () Canvas.

Обзор MSDN Focus действительно помог мне разобраться в этом.

person Spevy    schedule 01.10.2012