Текстовое поле в ContextMenu теряет фокус при перемещении мыши - PullRequest
1 голос
/ 08 ноября 2011

У меня есть текстовое поле с ControlTemplate элемента MenuItem, который находится внутри ContextMenu. Текстовое поле работает хорошо, и я могу ввести его правильно. Но если я наведу курсор мыши на любой из других пунктов меню в контекстном меню, они требуют фокусировки, и я теряю фокус из текстового поля. На этом этапе я должен вернуться в текстовое поле, чтобы продолжить ввод.

Есть шаблон или принятый метод решения этой проблемы?

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 ноября 2011

Хорошо, попробовав несколько разных вещей, я получил кое-что для работы:

Для всех других пунктов меню, которые могут захватывать фокус (при вводе с помощью мыши), установите e.Handled = true для события PriviewGoTKeyboardFocus:

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;
    }
  }
}
0 голосов
/ 08 ноября 2011

Если вы хотите вернуть фокус, вы можете напечатать, как показано ниже.

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

Я думаю, он может фокусироваться на текстовом поле.

...