我有一个带有MenuItem的ControlTemplate的文本框,它位于ContextMenu中。文本框效果很好,我可以正确输入。但是,如果我将鼠标移动到上下文菜单中的任何其他菜单项上,它们会声明焦点,我会从文本框中失去焦点。此时我必须回到文本框中继续输入。
是否有解决此问题的模式或可接受的方法?
由于
答案 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;
}
}
}