2012-10-01 20 views
3

我使用C#和XAML爲Windows Store創建遊戲。我所有的遊戲對象都有一個畫布,描述他們的視圖。這些畫布將顯示在畫布上(gameRoot)。Windows 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> 

我已經創建了我的事件處理程序斷點,KeyDown事件永遠不會觸發。谷歌後,我想通了,如果我創建一個按鈕到我的帆布事件將觸發。但如果我刪除,事件不會觸發。如果我點擊按鈕的任何地方,事件將永遠不會再次發射。

我的問題是:我如何創建一個鍵盤事件處理程序,每當我在頁面內按下某個鍵時觸發,而不取決於哪個元素具有焦點?

回答

4

您可以訂閱Window.Current.CoreWindow.KeyDown/Up事件。

+1

+1。是的,在全球範圍內捕捉關鍵事件,而不是綁定到特定的控制,更適合遊戲。但是,請注意,WPF和WinForms中的事件處理允許您一次只捕獲一個鍵或鼠標事件。 Direct X等遊戲界面允許您同時按下(並捕捉)幾個鍵盤和鼠標鍵。 –

0

前一陣子遇到了類似的問題。您必須將Canvas的「Focusable」屬性設置爲true。爲了讓畫布成爲焦點,您需要調用Canvas的Focus()函數。

請參閱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事件執行相同的操作。