尝试实现一个简单的 HTML 编辑器 TextBox。我有一个 UserControl,其中 Canvas
作为主容器,TextBox
和 ListBox
作为其子容器。默认情况下,ListBox 是不可见的。当用户按下 CTRL + SPACE
时,ListBox 应该出现在 TextBox 的当前插入符位置并且焦点应该转移到它,就像 Visual Studios 的 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 方法让它工作。尽管这取决于控件的实际 Tab 键顺序。
txt.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
关于您的评论,我确实注意到了这一点,并通过确保将列表框的 selectedIndex 设置为 -1 来解决这个问题
lst.SelectedIndex = -1;
关于c# - 设置/取消设置键盘焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22446876/