【问题标题】:Keyboard handling in windows 8 XAML based game基于 Windows 8 XAML 的游戏中的键盘处理
【发布时间】:2015-09-11 00:56:19
【问题描述】:

我正在使用 C# 和 XAML 为 Windows 应用商店创建游戏。我所有的游戏对象都有一个画布,用于描述它们的视图。这些画布将显示在画布(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 事件永远不会触发。经过一番谷歌,我想通了,如果我在 Canvas 事件中创建一个 Button 将会触发。但是如果我删除,事件将不会触发。如果我单击按钮外的任何位置,事件将永远不会再次触发。

我的问题是:如何创建一个键盘事件处理程序,每次我在页面中按下一个键时都会触发它,而不取决于哪个元素具有焦点?

【问题讨论】:

    标签: c# xaml windows-8 windows-runtime


    【解决方案1】:

    您可以订阅 Window.Current.CoreWindow.KeyDown/Up 事件。

    【讨论】:

    • +1。是的,全局捕获关键事件,而不是绑定到特定控件,更适合游戏。但是请注意,WPF 和 WinForms 中的事件处理只允许您一次捕获一个键或鼠标事件。 Direct X 等游戏界面允许您同时按下(并抓住)多个键盘和鼠标键。
    【解决方案2】:

    如果您想处理整个页面的按键事件,而不考虑焦点。将此 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 事件执行相同的操作。

    【讨论】:

      【解决方案3】:

      不久前遇到了类似的问题。您必须将 Canvas 的“Focusable”属性设置为 true。要让画布获得焦点,您需要调用 Canvas 的 Focus() 函数。

      请参阅MSDN Focus Overview 真的帮助我理解它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多