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 键时,文本框才会失去焦点。

提前致谢。

4

3 回答 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;
     }
  }
于 2013-03-19T13:22:44.593 回答
2

我知道这个答案可能为时已晚,无法帮助您,但也许它会帮助任何寻找解决此问题的人。

Focusable=falseMenuItems 上的设置也有效。它仍然允许单击它们并允许它们包含的控件具有焦点。但是,它禁用了仅使用键盘导航菜单的能力,从而引入了可访问性问题。

然而,通过给每个菜单项一个可聚焦的元素,可以通过一点创意来解决可访问性问题。例如:

<MenuItem Focusable="False">
    <MenuItem.Header>
        <StackPanel Orientation="Horizontal" Focusable="True" FocusVisualStyle="{x:Null}">
            <TextBlock Text="Do something!" />
        </StackPanel>
    </MenuItem.Header>
</MenuItem>

FocusVisualStyle="{x:Null}"代码需要隐藏原本会出现的虚线焦点(并且在菜单中看起来不合适)。

于 2016-05-04T21:13:54.150 回答
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>
于 2013-03-19T11:01:52.633 回答