在UWP应用程序中如何防止游戏手柄也移动插入符号?

时间:2018-01-21 19:42:22

标签: uwp mvvm-light gamepad

在UWP应用程序中,我需要从游戏手柄输入。它工作正常,但当用户移动拇指杆时,我也会得到当前插入符号在应用程序中移动的不必要的副作用。如何防止插入符移动?

该应用主要基于MVVM和MVVM灯,但Gamepad是在视图后面的代码中处理的。

这是后面代码中的视图构造函数(视图名为Settings,派生自Page)。

public Settings()
{
    InitializeComponent();

    // Gamecontroller
    gameControllerUpdateTimer = new DispatcherTimer();
    gameControllerUpdateTimer.Tick += gameControllerUpdateTimer_Callback;
    gameControllerUpdateTimer.Interval = new TimeSpan(0, 0, 0, 0, 100);

    GameControllerConnected = false;
    Gamepad.GamepadAdded += Gamepad_GamepadAdded;
    Gamepad.GamepadRemoved += Gamepad_GamepadRemoved;
}

和三个事件处理程序:两个用于Gamepad检测和删除,另一个用于读取Gamepad输入。

// Called periodically to check for user input throught the gamepad
void gameControllerUpdateTimer_Callback(object sender, object e)
{
    if (GameControllerConnected)
    {
        Gamepad gamePad = Gamepad.Gamepads[0];
        GamepadReading readings = gamePad.GetCurrentReading();
        LeftThumbStickX = readings.LeftThumbstickX;
        LeftThumbStickY = readings.LeftThumbstickY;
    }
}

// Called upon gamepad detection
async void Gamepad_GamepadAdded(object sender, Gamepad e)
{
    await Dispatcher.RunAsync(
            CoreDispatcherPriority.Normal, () =>
            {
                GameControllerConnected = true;
                gameControllerUpdateTimer.Start();
            });

}

// Called upon gamepad removal
async void Gamepad_GamepadRemoved(object sender, Gamepad e)
{
    await Dispatcher.RunAsync(
            CoreDispatcherPriority.Normal, () =>
            {
                GameControllerConnected = false;
                gameControllerUpdateTimer.Stop();
            });
}

编辑:下面是我正在处理的应用的屏幕截图。插入符/光标位于Textbox之一。当我在Gamepad上移动左侧拇指操纵杆时,插入符号/光标也会移动:它从一个Textbox移动到另一个,或者更好地说它会导致应用程序更改当前关注的UI控件。

enter image description here

1 个答案:

答案 0 :(得分:1)

为什么不在视图顶部KeyDown使用UIElement事件?

private void Grid_KeyDown(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
{
    if(e.Key == Windows.System.VirtualKey.GamepadLeftThumbstickLeft ||
       e.Key == Windows.System.VirtualKey.GamepadLeftThumbstickRight ||
       e.Key == Windows.System.VirtualKey.GamepadLeftThumbstickDown ||
       e.Key == Windows.System.VirtualKey.GamepadLeftThumbstickUp)
    {
        // do something or... nothing
        e.Handled == true;
    }
}