ContextMenu中的文本框失去了鼠标移动的重点

时间:2011-11-08 03:53:57

标签: wpf textbox focus contextmenu

我有一个带有MenuItem的ControlTemplate的文本框,它位于ContextMenu中。文本框效果很好,我可以正确输入。但是,如果我将鼠标移动到上下文菜单中的任何其他菜单项上,它们会声明焦点,我会从文本框中失去焦点。此时我必须回到文本框中继续输入。

是否有解决此问题的模式或可接受的方法?

由于

2 个答案:

答案 0 :(得分:0)

  

如果你想收回焦点,你可以输入如下。

textBox.CaptureMouse();
textBox.ReleaseMouseCapture();
  

我认为它可以将重点放在文本框上。

答案 1 :(得分:0)

在尝试了几件不同的事情后,我得到了一些工作:

对于可以捕获焦点的所有其他菜单项(在鼠标输入时),为PriviewGoTKeyboardFocus事件设置e.Handled = true:

void menuItem_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
  e.Handled = true;
}

可以通过循环浏览上下文菜单中的所有菜单项,从窗口基类自动执行此操作。这需要劫持您插入文本框的菜单项的标记。

void contextMenu_Opened(object sender, RoutedEventArgs e)

{
  ContextMenu contextMenu = sender as ContextMenu;
  foreach (FrameworkElement frameworkElement in contextMenu.Items)
  {
    if (frameworkElement is MenuItem)
    {
      MenuItem menuItem = (frameworkElement as MenuItem);
      if (!(menuItem.Tag != null && menuItem.Tag.ToString() == "MaintainFocus"))
        menuItem.PreviewGotKeyboardFocus += new KeyboardFocusChangedEventHandler(menuItem_PreviewGotKeyboardFocus);
    }
  }
}
void contextMenu_Closed(object sender, RoutedEventArgs e)
{
  ContextMenu contextMenu = sender as ContextMenu;
  foreach (FrameworkElement frameworkElement in contextMenu.Items)
  {
    if (frameworkElement is MenuItem)
    {
      MenuItem menuItem = (frameworkElement as MenuItem);
      if (!(menuItem.Tag != null && menuItem.Tag.ToString() == "MaintainFocus"))
        menuItem.PreviewGotKeyboardFocus -= menuItem_PreviewGotKeyboardFocus;
    }
  }
}