使wpf元素在失去焦点时隐藏起来

本文关键字:隐藏 起来 焦点 失去 wpf 元素 | 更新日期: 2023-09-27 18:26:22

我有一个WPF菜单栏,当程序启动时,它会折叠起来,可以通过按下F10来显示(就像Firefox)

<Menu x:Name="mainMenuBar" Height="20" Width="130" HorizontalAlignment="Left" DockPanel.Dock="Top" FocusManager.LostFocus="mainMenuBar_LostFocus">

我有一些代码,我认为如果它失去焦点(即用户使用FocusManager.LostFocus属性单击菜单栏和子菜单以外的其他地方),它会再次折叠。

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;
}

当我从菜单栏上单击时,它不会塌陷,但当我单击菜单栏时,它会塌陷。这种行为与我的预期相反,有人知道为什么会发生这种情况吗?

编辑:XAML代码

<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>

使wpf元素在失去焦点时隐藏起来

我找到了实现愿望行为的方法。按您的操作显示菜单,但即使不设置焦点。

protected override void OnKeyDown(KeyEventArgs e)
{
    if(e.SystemKey == Key.F10)
    {
        mainMenuBar.Visibility = Visibility.Visible;
    }
    base.OnKeyDown(e);
}

覆盖菜单所在窗口的OnPreviewMouseDown

protected override void OnPreviewMouseDown(MouseButtonEventArgs e)
{
    if (mainMenuBar.IsVisible && e.Source != mainMenuBar&& !IsMenuChildMouseDown(e.Source as FrameworkElement))
    {
        mainMenuBar.Visibility = Visibility.Collapsed;
    }
    base.OnPreviewMouseDown(e);
}

并创建方法IsMenuChildMouseDown(FrameworkElement elem),用于检查是否在菜单的子菜单上按下了鼠标。

    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);
        }
    }