WinForms 列表框 keydown 事件不会触发

WinForms listbox keydown event won't fire

我正在尝试制作一个 WinForm ListBox,您可以在其中使用箭头键循环浏览。我还有两个按钮,您可以单击它们在列表中上下移动。这些按钮确实产生了预期的效果。问题是 ListBox 的 keyDown 事件从未被触发

    public MainForm()
    {
        InitializeComponent();
        if (this.clipboardHistoryList.Items.Count > 0)
            this.clipboardHistoryList.SetSelected(0, true);
        clipboardHistoryList.Select();
    }

   private void goUpButton_Click(object sender, EventArgs e)
    {
        goUpList();
    }

    private void goDownButton_Click(object sender, EventArgs e)
    {
        goDownList();
    }

    private void goDownList()
    {
        if (clipboardHistoryList.SelectedIndex == clipboardHistoryList.Items.Count - 1)
        {
            clipboardHistoryList.SetSelected(0, true);
        }
        else
        {
            clipboardHistoryList.SetSelected(clipboardHistoryList.SelectedIndex + 1, true);
        }
    }

    private void goUpList()
    {
        if (clipboardHistoryList.SelectedIndex == 0)
        {
            clipboardHistoryList.SetSelected(clipboardHistoryList.Items.Count - 1, true);
        }
        else
        {
            int l_currentlySelected = clipboardHistoryList.SelectedIndex;
            clipboardHistoryList.SetSelected(l_currentlySelected - 1, true);
        }
    }

    private void clipboardHistoryList_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Up)         //Brekpoint is never reached
        {
            goUpList();
        }
        else if (e.KeyCode == Keys.Down)
        {
            goDownList();
        }
    }

我已将 MainForm 的 keypreview 属性设置为 true。

默认情况下,箭头键在列表框上有效,但如果您在最后一个元素上按下向下箭头,它们不会让您从最后一个元素跳到第一个元素——希望这是有意义的。

编辑 我在 Microsoft's documentation 上看到我需要覆盖 ProcessDialogKey 方法,但我不确定我需要做什么。

Perform special input or navigation handling on a control. For example, you want the use of arrow keys in your list control to change the selected item. Override ProcessDialogKey

是否已经有内置方法来启用此行为?

我错过了什么?

谢谢!

通过查看 Designer.cs 文件中的代码,您似乎并没有将 clipboardHistoryList 控件连接到 clipboardHistoryList_KeyDown 事件处理程序。您可以通过 visual studio 表单设计器中属性 window 的 "Events" 子选项卡(寻找小闪电图标)并以这种方式通过设计器连接事件,或者或者你可以在代码中做到这一点:

public MainForm()
{
    InitializeComponent();
    if (this.clipboardHistoryList.Items.Count > 0)
        this.clipboardHistoryList.SetSelected(0, true);
    clipboardHistoryList.Select();

    clipboardHistoryList.KeyDown += clipboardHistoryList_KeyDown;
}