c# - 设置/取消设置键盘焦点

标签 c# .net wpf focus

尝试实现一个简单的 HTML 编辑器 TextBox。我有一个 UserControl,其中 Canvas 作为主容器,TextBoxListBox 作为其子容器。默认情况下,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/

相关文章:

c# - VB.NET 和 sizeof

c# - 如何使用 MailKit 以相反的顺序获取 UID 列表?

c# - 在 C# 中的单色位图上绘制文本

c# - WPF DataGrid显示有限的行数并在该数后滚动

c# - 如何在点击时交换图像?

c# - 用于在 XAML 中绑定(bind) TimeSpan 的 StringFormat 不起作用

c# - 在单个表单中使用带有多个控件的 MVVM

c# - WPF ComboBox 延迟过滤

c# - .Net 的 REST 工具包?

C# 正则表达式帮助获取多个值