从下一个控件触发KeyUp事件

时间:2014-02-07 12:12:33

标签: c# winforms

我的Windows应用程序中有5个按钮。当我单击箭头键时,焦点在按钮之间切换,然后只有

  

KEYUP

事件解雇。如何阻止这个?

3 个答案:

答案 0 :(得分:1)

订阅PreviewKeyDown活动。

  

当焦点在此控件上时按下某个键时,在KeyDown事件之前发生。

当您浏览按钮时,sender参数将包含先前选择的按钮。


我找到了适合您的解决方案,改编自here。显然,MS决定箭头键不会触发KeyDown事件,因此您无法取消它们。

一种解决方法是指定箭头键是普通输入键,就像任何其他键一样。然后KeyDown事件将会触发,如果需要,您可以取消按下按钮。

private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    if (e.KeyCode == Keys.Left || e.KeyCode == Keys.Right || e.KeyCode == Keys.Up || e.KeyCode == Keys.Down)
        e.IsInputKey = true;
}

private void button1_KeyDown(object sender, KeyEventArgs e)
{
    e.Handled = true;
}

您可能需要阅读that post中的其他答案和评论,看看哪种情况最适合您的情况。

答案 1 :(得分:0)

在评论中回答您的问题

    void button1_LostFocus(object sender, EventArgs e)
    {
        button1.Focus();
    }

答案 2 :(得分:0)

要防止 Up Button移动焦点,您必须至少使用3种方法:

    bool _focus;

    private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == Keys.Up)
            _focus = true;
    }

    private void button1_KeyUp(object sender, KeyEventArgs e)
    {
        _focus = false;
    }

    private void button1_Leave(object sender, EventArgs e)
    {
        if(_focus)
            button1.Focus(); // or (sender as Control)
    }

当用户按 Up 并在Leave中返回焦点时,使用标记。您必须在KeyUp中取消标记,否则无法更改焦点(按 Tab 示例)。

你可以在Leave中取消标记,我没有测试它。