在我的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键,则文本框仅会失去焦点。
提前致谢。
答案 0 :(得分:6)
正如我写的,我不确定你如何使用菜单控件。 但也许这段代码剪断可以帮助你或给你一个提示:
<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 :(得分:2)
我知道这个答案可能为时已晚,无法帮助您,但也许它可以帮助任何人找到解决此问题的方法。
在MenuItems上设置padding-top: 0px;
也有效。它仍然允许单击它们并允许其包含的控件具有焦点。但是,它禁用了仅使用键盘导航菜单的功能,从而引入了辅助功能问题。
通过为每个菜单项提供可聚焦元素,可以通过一点创造力解决可访问性问题。例如:
Focusable=false
需要<MenuItem Focusable="False">
<MenuItem.Header>
<StackPanel Orientation="Horizontal" Focusable="True" FocusVisualStyle="{x:Null}">
<TextBlock Text="Do something!" />
</StackPanel>
</MenuItem.Header>
</MenuItem>
代码来隐藏否则会出现的虚线焦点(并且在菜单中看起来不合适)。
答案 2 :(得分: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>