Sharpdx takeit 输入不适用于 windows 10 个通用应用程序
Sharpdx tookit input won't work with windows 10 universal apps
我正在 windows 10 中使用通用应用程序试用 sharpdx tookit,但无法使输入正常工作。我知道我必须为不同的设备创建不同的输入,但现在我只想尝试键盘。
所以我先按照这个link来设置项目:Is there a SharpDx Template, for a Windows Universal App?
现在我正在尝试像往常一样输入:
在构造函数中:
_keyboardManager = new KeyboardManager(this);
在更新方法中:
var state = _keyboardManager.GetState();
if (state.IsKeyDown(Keys.B))
{
//do stuff
}
但他从未注册过按键 B 已关闭(或我尝试过的任何其他按键)。我也试过 GetDownKeys() 但列表总是空的。
那么有人知道在这里做什么吗?
HEUREKA!
我遇到了同样的问题,但是 windows 8.1。我花了 2 天时间才找到解决方案。这是愚蠢的 SwapChainPanel,它不能成为焦点,因为 class 没有继承自 Control class,所以它不会处理键盘事件。
解决方案是HERE,也就是说,你必须放一个XAML继承自Controlclass的元素,比如Button来处理事件。我的 XAML 文件是这样的:
<SwapChainPanel x:Name="_swapChainPanel"
Loaded="_swapChainPanel_Loaded"
KeyDown="_swapChainPanel_KeyDown">
<Button x:Name="_swapChainButton"
Content="Button"
HorizontalAlignment="Left"
Height="0"
VerticalAlignment="Top"
Width="0"
KeyDown="_swapChainButton_KeyDown">
</Button>
</SwapChainPanel>
在 XAML.cs 我是这样处理事件的:
private void _swapChainButton_KeyDown(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
{
e.Handled = false; //This will pass the event to its parent, which is the _swapChainPanel
}
private void _swapChainPanel_KeyDown(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
{
game.KeyboardEvent();
}
在 KeyboardEvent() 方法中,我放置了 if 东西...并且您必须使用代码手动使按钮处于焦点状态。 “_swapChainButton.Focus(FocusState.Programmatic);”
但最后,它对我来说不是很好,它太慢了。它有延迟。 :/
还有另一个更好、更简单的版本:
using Windows.UI.Core;
using SharpDX.Toolkit;
using Windows.System;
namespace Example
{
class MyGame : Game
{
public MyGame()
{
CoreWindow.GetForCurrentThread().KeyDown += MyGame_KeyDown;
}
void MyGame_KeyDown(CoreWindow sender, KeyEventArgs args)
{
System.Diagnostics.Debug.WriteLine(args.VirtualKey);
}
}
}
您必须订阅 CoreWindow 的事件,仅此而已:)
我正在 windows 10 中使用通用应用程序试用 sharpdx tookit,但无法使输入正常工作。我知道我必须为不同的设备创建不同的输入,但现在我只想尝试键盘。
所以我先按照这个link来设置项目:Is there a SharpDx Template, for a Windows Universal App?
现在我正在尝试像往常一样输入:
在构造函数中:
_keyboardManager = new KeyboardManager(this);
在更新方法中:
var state = _keyboardManager.GetState();
if (state.IsKeyDown(Keys.B))
{
//do stuff
}
但他从未注册过按键 B 已关闭(或我尝试过的任何其他按键)。我也试过 GetDownKeys() 但列表总是空的。
那么有人知道在这里做什么吗?
HEUREKA!
我遇到了同样的问题,但是 windows 8.1。我花了 2 天时间才找到解决方案。这是愚蠢的 SwapChainPanel,它不能成为焦点,因为 class 没有继承自 Control class,所以它不会处理键盘事件。
解决方案是HERE,也就是说,你必须放一个XAML继承自Controlclass的元素,比如Button来处理事件。我的 XAML 文件是这样的:
<SwapChainPanel x:Name="_swapChainPanel"
Loaded="_swapChainPanel_Loaded"
KeyDown="_swapChainPanel_KeyDown">
<Button x:Name="_swapChainButton"
Content="Button"
HorizontalAlignment="Left"
Height="0"
VerticalAlignment="Top"
Width="0"
KeyDown="_swapChainButton_KeyDown">
</Button>
</SwapChainPanel>
在 XAML.cs 我是这样处理事件的:
private void _swapChainButton_KeyDown(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
{
e.Handled = false; //This will pass the event to its parent, which is the _swapChainPanel
}
private void _swapChainPanel_KeyDown(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
{
game.KeyboardEvent();
}
在 KeyboardEvent() 方法中,我放置了 if 东西...并且您必须使用代码手动使按钮处于焦点状态。 “_swapChainButton.Focus(FocusState.Programmatic);”
但最后,它对我来说不是很好,它太慢了。它有延迟。 :/
还有另一个更好、更简单的版本:
using Windows.UI.Core;
using SharpDX.Toolkit;
using Windows.System;
namespace Example
{
class MyGame : Game
{
public MyGame()
{
CoreWindow.GetForCurrentThread().KeyDown += MyGame_KeyDown;
}
void MyGame_KeyDown(CoreWindow sender, KeyEventArgs args)
{
System.Diagnostics.Debug.WriteLine(args.VirtualKey);
}
}
}
您必须订阅 CoreWindow 的事件,仅此而已:)