2012-10-01 3 views
3

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

Я хочу переместить моего игрока на основе нажатого им ключа (например, 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> 

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

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

ответ

4

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

+1

+1. Да, ловить ключевые события глобально, а не привязаны к определенному контролю, более подходит для игр. Обратите внимание, однако, что обработка событий в WPF и WinForms позволяет сразу поймать только одно событие с ключом или мышью. Игровые интерфейсы, такие как Direct X, позволяют одновременно нажать (и поймать) несколько клавиш клавиатуры и мыши. –

0

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

См. MSDN Focus Overview действительно помог мне обвести вокруг себя.

1

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

Window.Current.CoreWindow.KeyDown += CoreWindow_KeyDown; 

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

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

    } 

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

Смежные вопросы