尝试实现一个简单的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;
}
}
答案 0 :(得分:1)
我能够复制你的问题,看起来焦点没有被分配到你的列表框并保留在TextBox中。我能够通过使用文本框的MoveFocus方法让它工作。虽然这取决于控件的实际Tab键顺序。
txt.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
在参考您的评论时,我确实注意到并通过确保将Listbox的selectedIndex设置为-1来解决这个问题
lst.SelectedIndex = -1;