设置/取消键盘焦点
本文关键字:焦点 键盘 取消 设置 | 更新日期: 2023-09-27 17:50:29
尝试实现一个简单的HTML编辑器TextBox。我有一个用户控制与Canvas
作为主要容器和TextBox
和ListBox
作为它的孩子。默认情况下,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;