I have a WPF Menu bar which is collapsed when the program starts, and can be shown by pressing F10 (like Firefox)
<Menu x:Name="mainMenuBar" Height="20" Width="130" HorizontalAlignment="Left" DockPanel.Dock="Top" FocusManager.LostFocus="mainMenuBar_LostFocus">
I have code which I though would make it collapse again if it loses focus (i.e. the user clicks somewhere other than the menu bar and the sub menus) using the FocusManager.LostFocus
property.
private void showMenuBar(object sender, KeyEventArgs e)
{
if(e.SystemKey == Key.F10)
{
mainMenuBar.Visibility = Visibility.Visible;
mainMenuBar.Focus();
}
}
private void mainMenuBar_LostFocus(object sender, RoutedEventArgs e)
{
mainMenuBar.Visibility = Visibility.Collapsed;
}
When I click away from the menu bar it does not collapse, but it does when I click on the menu bar. This behaviour is the opposite of what I expected, does anyone know why this is happening?
Edit: XAML Code
<Menu x:Name="mainMenuBar" Height="20" Width="130" HorizontalAlignment="Left" DockPanel.Dock="Top">
<MenuItem Header="File">
<Separator />
<MenuItem Header="Exit" Click="menuFileExit_Click" ToolTip="Close Program" />
</MenuItem>
<MenuItem Header="Options">
<MenuItem Header="Settings" Click="menuOptionsSettings_Click" />
</MenuItem>
<MenuItem Header="Help">
<MenuItem Header="Read Me" Click="menuHelpReadMe_Click" />
<MenuItem Header="Version History" Click="menuHelpVersionHistory_Click" />
<MenuItem Header="About" Click="menuHelpAbout_Click" />
</MenuItem>
</Menu>
I found the way to get wished behaviour. Show menu as you do but even without setting focus.
protected override void OnKeyDown(KeyEventArgs e)
{
if(e.SystemKey == Key.F10)
{
mainMenuBar.Visibility = Visibility.Visible;
}
base.OnKeyDown(e);
}
Override OnPreviewMouseDown
for window where your menu is.
protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
{
if (mainMenuBar.IsVisible && e.Source != mainMenuBar&& !IsMenuChildMouseDown(e.Source as FrameworkElement))
{
mainMenuBar.Visibility = Visibility.Collapsed;
}
base.OnPreviewMouseDown(e);
}
And create method IsMenuChildMouseDown(FrameworkElement elem)
for checking if mouse was pressed on child of menu.
private bool IsMenuChildMouseDown(FrameworkElement elem)
{
if (elem == null)
return false;
DependencyObject parent = elem.Parent;
if (parent == null)
return false;
else
{
if (parent == mainMenuBar)
return true;
return IsMenuChildMouseDown(parent as FrameworkElement);
}
}