Текстовое поле в контекстном меню теряет фокус при перемещении мыши

#wpf #textbox #focus #contextmenu

#wpf #текстовое поле #фокус #contextmenu

Вопрос:

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

Существует ли шаблон или принятый метод решения этой проблемы?

Спасибо

Комментарии:

1. Не могли бы вы, пожалуйста, опубликовать какой-нибудь код? Я пробовал вашу реализацию, и у меня нет этой проблемы

2. Мы значительно изменили стиль пунктов меню, поэтому его довольно сложно продемонстрировать здесь. Если вы не видите проблемы, возможно, это из-за нашего стиля.

Ответ №1:

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

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

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

Комментарии:

1. Проблема в том, что текстовое поле теряет фокус. Я не понимаю, как CaptureMouse может помочь, потому что он все равно может снова потерять фокус.

2. После присвоения имени текстовому полю можете ли вы использовать CaptureMouse и выпустить код Mousecapture в menuItem_PreviewGotKeyboardFocus?

Ответ №2:

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

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

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

Это можно сделать автоматически из базового класса window, прокручивая все пункты меню в контекстном меню. Для этого требуется перехватить тег для тех элементов меню, в которые вы вставляете текстовое поле.

 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 amp;amp; 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 amp;amp; menuItem.Tag.ToString() == "MaintainFocus"))
        menuItem.PreviewGotKeyboardFocus -= menuItem_PreviewGotKeyboardFocus;
    }
  }
}