2012-11-27 52 views
0

我已經創建了一個可以正常工作的遊戲,但是我的鍵盤命令部分有問題。當我點擊屏幕上的某個地方時,我的KeyDown事件不起作用。我猜想,具有KeyDown的事件處理程序的控件失去了焦點,我的應用程序沒有收到消息。我花了一個星期的時間試圖解決這個問題。Keybord事件不能正常工作

我試着爲更多的控件設置KeyDown事件。我也嘗試着設置處理事件的控件的焦點而沒有成功。

如果有人告訴我,在我的遊戲中處理按鍵集合的正確方式是什麼,這將適用於我的應用程序中發生的任何事情。我只想知道用戶何時按下箭頭鍵才能更改內容。

回答

0

我不確定WinRT,但在WPF中,您可以通過添加像這樣的處理程序來捕獲來自所有子控件的路由事件。

this.AddHandler(UIElement.PreviewKeyDownEvent, new RoutedEventHandler(OnKeyDown), true); 

這是父母控制。它可以對WinRT的工作太,請嘗試

編輯

UIElement.KeyDownEvent如果UIElement.PreviewKeyDownEvent在WinRT中

不存在替代 UIElement.PreviewKeyDownEvent
0

我之前沒回答,因爲系統沒有讓我做因爲我沒有10點聲望點,所以我不得不等待8個小時。

這就是我輸入的內容,但似乎需要在那裏聲明一些我不知道如何製作的東西。

this.AddHandler(UIElement.KeyUpEvent, new RoutedEventHandler(KeyUp), true); 

該錯誤消息

委託Windows.UI.Xaml.RoutedEventHandler 表示將要處理的路由事件的方法。 錯誤: 沒有爲'KeyUp'重載匹配委託'Windows.UI.Xaml.RoutedEventHandler。

這將作爲事件處理函數的格式如下:

private void KeyUp(object sender, KeyRoutedEventArgs e) 
{ 
} 

我找到了一種方法來繞過我的問題,我想與大家分享它,以防萬一有人需要它,但如果別人知道更好的方式讓我知道。

我放在一個按鈕出頁面的可視面積,我用它的KeyUp事件和我寫的代碼,以確保它始終是積極的。下面你可以找到我的代碼。

public frmMain() 
{ 
    this.InitializeComponent(); 

    btnKeboardCollector.Loaded += MyBoard_Loaded; 
    btnKeboardCollector.LostFocus += btnKeboardCollector_LostFocus; 
    btnKeboardCollector.KeyUp += KeyUpHandler; 
} 

void MyBoard_Loaded(object sender, RoutedEventArgs e) 
{ 
    // I do other initialization here 

    btnKeboardCollector.Focus(Windows.UI.Xaml.FocusState.Programmatic); 
} 

void btnKeboardCollector_LostFocus(object sender, RoutedEventArgs e) 
{ 
    btnKeboardCollector.Focus(Windows.UI.Xaml.FocusState.Programmatic); 
} 

private void KeyUpHandler(object sender, KeyRoutedEventArgs e) 
{ 
} 
1

我只遇到過類似問題,但後來我迷上到他們是如何做到這一點的LayoutAwarePage.CoreDispatcher_AcceleratorKeyActivated,它似乎作爲一切工作的預期。

+0

是。 CoreDispatcher.AcceleratorKeyActivated事件:激活加速鍵(按下或按住)時觸發。我想指出,如果遇到它,CoreAcceleratorKeys.AcceleratorKeyActivated是相同的事件。 –

0

我剛剛發現了一個非常簡單的解決方案。無論某個元素是否被關注,它總是有效。

1:功能

private void onAcceleratorKey(object sender, AcceleratorKeyEventArgs e) 
{ 
    CoreVirtualKeyStates ctrl = Window.Current.CoreWindow.GetAsyncKeyState(VirtualKey.Control); 

    if (ctrl == CoreVirtualKeyStates.Down) 
    { 
     switch (e.VirtualKey) 
     { 
      case VirtualKey.F: 
       // CTRL + F pressed. 
       break; 
     } 
    } 
} 

第二:事件

Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += onAcceleratorKey;