#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;
}
}
}