设置/取消键盘焦点

本文关键字:焦点 键盘 取消 设置 | 更新日期: 2023-09-27 17:50:29

尝试实现一个简单的HTML编辑器TextBox。我有一个用户控制与Canvas作为主要容器和TextBoxListBox作为它的孩子。默认情况下,ListBox是不可见的。当用户按下CTRL + SPACE时,ListBox应该出现在TextBox当前的插入符号位置,焦点应该转移到它,就像Visual studio的List Members功能一样。然后用户从列表中选择一个项目并按下ENTER,所选的项目被插入到TextBox中。然后ListBox再次变得不可见,焦点转移回TextBox

下面的代码可以让我完成上面的所有操作;几乎。只有第一次才管用!下次我按下CTRL + ENTER时,ListBox出现,似乎也有焦点,但按下(或上)箭头将焦点移回TextBox,从而移动插入符号。这是怎么了?

private void txt_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.Space && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
    {
        var Rect = txt.GetRectFromCharacterIndex(txt.SelectionStart , true);
        Canvas.SetLeft(lst, Rect.Right);
        Canvas.SetTop(lst, Rect.Bottom);
        lst.Visibility = System.Windows.Visibility.Visible;
        lst.Focus();
    }
}
private void lst_KeyDown(object sender, KeyEventArgs e)
{
    if(e.Key == Key.Enter)
    {
        txt.Focus();
        lst.Visibility = System.Windows.Visibility.Hidden;
        txt.SelectedText = lst.SelectedItem.ToString();
        txt.SelectionStart += lst.SelectedItem.ToString().Length;
        txt.SelectionLength = 0;
    }
}

设置/取消键盘焦点

我能够复制您的问题,似乎焦点没有被分配到您的列表框中,而是留在文本框中。我能够通过使用文本框的MoveFocus方法让它工作。尽管这取决于控件的实际制表符顺序。

txt.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));

关于你的评论,我确实注意到这一点,并通过确保我将Listbox的selectedIndex设置为-1来解决这个问题

lst.SelectedIndex = -1;