设置/取消设置键盘焦点

时间:2014-03-17 04:17:45

标签: c# .net wpf focus

尝试实现一个简单的HTML编辑器TextBox。我有一个UserControl,其中Canvas为主要容器,TextBoxListBox为其子容器。 ListBox默认是不可见的。当用户按下CTRL + SPACE时,ListBox应出现在TextBox的当前插入位置,焦点应该转移到它,就像Visual Studios的 List Members 功能一样。然后,用户从列表中选择一个项目并按ENTER,并将所选项目插入TextBoxListBox然后再次变为不可见,焦点转移回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;
    }
}

1 个答案:

答案 0 :(得分:1)

我能够复制你的问题,看起来焦点没有被分配到你的列表框并保留在TextBox中。我能够通过使用文本框的MoveFocus方法让它工作。虽然这取决于控件的实际Tab键顺序。

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

在参考您的评论时,我确实注意到并通过确保将Listbox的selectedIndex设置为-1来解决这个问题

lst.SelectedIndex = -1;