【问题标题】:Setting/unsetting keyboard focus设置/取消设置键盘焦点
【发布时间】:2014-04-22 05:11:15
【问题描述】:

尝试实现一个简单的 HTML 编辑器 TextBox。我有一个用户控件,其中 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;
    }
}

【问题讨论】:

标签: c# .net wpf focus


【解决方案1】:

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

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

参考您的评论,我确实注意到了这一点,并通过确保将列表框的 selectedIndex 设置为 -1 来解决它

lst.SelectedIndex = -1;

【讨论】:

  • 你把这条线放在哪里?
  • 替换你的 lst.Focus
  • 现在有一些帮助。谢谢一堆。但这至少带来了几个问题。 1.有没有注意到ListBox第二次出现的问题,虽然高亮了之前选中的项,但真正的焦点是第一项。 2. 我们将这种行为称为错误还是“功能”?
  • 很好,比我切换 txt.Focusable 的解决方案更好
  • 我可以通过将列表的选定项目设置为 -1 即 lst.SelectedIndex = -1; 来解决这个问题
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2012-05-14
  • 1970-01-01
相关资源
最近更新 更多