在 UWP 应用程序中,如何防止 Gamepad 也移动插入符号?

Posted

技术标签:

【中文标题】在 UWP 应用程序中,如何防止 Gamepad 也移动插入符号?【英文标题】:In a UWP app how to prevent the Gamepad to move the caret too? 【发布时间】:2018-01-21 19:42:22 【问题描述】:

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

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

// 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 控件。

【问题讨论】:

当前插入符号是什么意思?能发个截图吗? @MartinZikmund 感谢您的关注。我刚刚上传了一个屏幕截图,希望能更好地解释这个问题。 【参考方案1】:

为什么不使用视图顶部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;
    

【讨论】:

这很有趣,我会尝试并报告。 好的,成功了|非常感谢!我用我使用的实际代码编辑了你的答案 有时 CoreWindow 和/或 PreviewKey...- 方法甚至更好。

以上是关于在 UWP 应用程序中,如何防止 Gamepad 也移动插入符号?的主要内容,如果未能解决你的问题,请参考以下文章

UWP在中国不允许打电话,如何防止在中国部署?

如何在 Python 中记录 xbox/gamepad 控制器的状态?

UWP - 防止 NavigationViewItemHeader 被剪裁

UWP MediaPlayerElement 防止传输控件重叠视频

Xamarin Forms - 防止键盘在 UWP、Android、iOS 中的条目焦点上显示

WPF 中的 XNA GamePad 输入触发事件