WPF TextBox菜单项失去焦点的问题

8

在我的WPF应用程序中,我希望菜单项有一个文本框。我使用以下代码成功实现了这一点:

<Menu Height="23" HorizontalAlignment="Stretch" Name="MainMenu" VerticalAlignment="Top">
    <MenuItem Header="File">
        <MenuItem Header="Exit" Click="menuItemExit_Click" />
    </MenuItem>
    <MenuItem Header="Settings">
        <MenuItem Header="Some setting" IsCheckable="True" />
        <Separator />
        <MenuItem>
            <MenuItem.Header>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <Label Content="Some value:" Margin="0,3,6,0" Padding="0" />
                    <TextBox Margin="0,0,0,6" Grid.Column="1" />
                </Grid>
            </MenuItem.Header>
        </MenuItem>
    </MenuItem>
</Menu>

这段代码展示了我期望的菜单项,但如果我在文本框中输入一些值,然后将鼠标移动(不点击)到文本框菜单项之外,文本框就会失去焦点,直到我再次点击文本框才能继续输入。如何实现与WinForms中文本框菜单项相同的行为?也就是说,只有当用户点击文本框外部或按下Tab键时,文本框才会失去焦点。
提前感谢您的帮助。
3个回答

7

正如我所写的,我不确定您如何使用菜单控件。 但也许这段代码片段可以帮助您或给您一些提示:

<TextBox Margin="0,0,0,6" Grid.Column="1" PreviewLostKeyboardFocus="OnPreviewLostKeyboardFocus"/>

以及相应的方法:

private void OnPreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
  {
     if (MainMenu.IsKeyboardFocusWithin)
     {
        e.Handled = true;
     }
  }

1
如果在同一菜单中有多个控件,可以通过设置 e.Handled 只在 e.NewFocus 是 MenuItem 时才生效来帮助解决问题。这样,您仍然可以单击同一菜单中的其他文本框。 - Simon F

2
我知道这个答案可能太晚了,无法帮助你,但也许它会帮助任何正在寻找解决此问题的人。
在菜单项上设置Focusable=false也可以起作用。它仍然允许单击它们并允许它们包含的控件获得焦点。但是,它禁用了使用键盘导航菜单的能力,从而引入了可访问性问题。
然而,通过为每个菜单项提供可聚焦元素,可以解决可访问性问题。例如:
<MenuItem Focusable="False">
    <MenuItem.Header>
        <StackPanel Orientation="Horizontal" Focusable="True" FocusVisualStyle="{x:Null}">
            <TextBlock Text="Do something!" />
        </StackPanel>
    </MenuItem.Header>
</MenuItem>
FocusVisualStyle="{x:Null}" 代码用于隐藏在菜单中出现的点状焦点,否则会显得格格不入。请注意保留 HTML 标签。

0
也许这可以帮助:
    <MenuItem StaysOpenOnClick="True">
        <MenuItem.Header>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Label Content="Some value:" Margin="0,3,6,0" Padding="0" />
                <TextBox Margin="0,0,0,6" Grid.Column="1" />
            </Grid>
        </MenuItem.Header>
    </MenuItem>

很抱歉,它并没有解决我的问题,但还是谢谢。当我点击鼠标时的行为已经很好了,问题在于当我将光标移动到文本框菜单项之外时,它会失去焦点,我就无法再输入了。 - dbostream
抱歉,我的错。我没有正确理解你的问题,很抱歉。我尝试了你粘贴的代码,但我没有遇到你描述的行为。你有更多的信息吗?(例如 MenuItem 的 XAML 元素等) - rhe1980

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接