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

In a UWP app how to prevent the Gamepad to move the caret too?

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

该应用程序主要基于 MVVM with MVVM light,但 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;
}

和三个事件处理程序:两个用于游戏手柄检测和移除,一个用于读取游戏手柄输入。

// 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();
            });
}

编辑:下面是我正在开发的应用程序的屏幕截图。 caret/cursor 在 Textbox 之一中。当我在 Gamepad 上移动左摇杆时,caret/cursor 也会移动:它从一个 Textbox 移动到另一个,或者更好的说法是它会导致应用程序更改当前聚焦的 UI控制.

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

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;
    }
}