WPF子菜单项在鼠标到达之前就关闭了

6
有非常少的人面临这个问题,他们无法响应子菜单项,因为鼠标在到达子菜单之前就关闭了。在底部添加了一个GIF。我们无法重现此行为,似乎只影响极少数人。 enter image description here 我们使用Hardcodet.Wpf.TaskbarIcon来显示菜单。欢迎任何想法。这是代码片段,我仅说明了一个菜单项,但其他菜单项遵循相同的逻辑:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:tb="http://www.hardcodet.net/taskbar"
                    xmlns:local="clr-namespace:FreedomPlatform"
                    xmlns:converters="clr-namespace:FreedomPlatform.Converters">
    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
    <converters:InverseBooleanConverter x:Key="InverseBooleanConverter" />
    <converters:InverseAndBooleanConverter x:Key="InverseAndBooleanConverter" />
    <Style TargetType="{x:Type MenuItem}">
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
    </Style>
    <ContextMenu x:Key="FreedomTrayMenu" AutomationProperties.Name="Freedom">
        
        <MenuItem Header="Options">
            <MenuItem Header="Run on Startup" StaysOpenOnClick="True" IsCheckable="True" IsChecked="{Binding RunOnStartup}" IsEnabled="{Binding RunOnStartupModificationEnabled}" />
            
        </MenuItem>
        <Separator />
    </ContextMenu>
    
    <tb:TaskbarIcon x:Key="FreedomNotifyIcon"
                    IconSource="{Binding StatusIconPath}"
                    ContextMenu="{StaticResource FreedomTrayMenu}" MenuActivation="LeftOrRightClick" KeyUp="{Binding OnKeyUp}">
        
        <!-- Self-assign a data context (could also be done programmatically) -->
        <tb:TaskbarIcon.DataContext>
            <local:StatusViewModel />
        </tb:TaskbarIcon.DataContext>
    </tb:TaskbarIcon>
    
</ResourceDictionary>

真正的Win32 HMENU并不这样做。 - Anders
你的意思是我们使用的包有问题吗? - KangJiYoung13
在 .NET 6 中的行为与以往不同,即当鼠标离开顶级 MenuItem 时,它不会立即取消选择,而是会有一些延迟,这为子菜单保持打开状态直至鼠标进入提供了足够的时间。 - rucamzu
2个回答

1
如果您决定使用 Hardcodet.Wpf.TaskbarIcon,请联系编写 TaskBarIcon 的人;如果不想使用,我建议您使用 System.Windows.Forms.NotifyIcon 并编写一些 C# 代码,这里有一个好的答案,已被 Jesper Jensen 接受。请注意,托盘图标是由 Windows 拥有的,而 WPF 只是 Windows 可执行文件的不同 UI,这意味着您可以通过 C# 代码使用 NotifyIcon 或其他来自 Windows 的内容。NotifyIcon 公开了处理点击气球、图标、鼠标事件等的方法。

1
尝试像这样在父级 MenuItem 上设置 OnMouseLeave:
<ResourceDictionary ... 
    x:Class="ContextMenuHandler">
    <!--...-->
    <MenuItem Header="Options" MouseLeave="OnMouseLeave">
        <!--...-->
    </MenuItem>
    <!--...-->
</ResourceDictionary>

然后还需要添加一个名为ContextMenuHandler.cs的类。
    public partial class ContextMenuHandler : ResourceDictionary
    {
        public void OnMouseLeave(object sender, EventArgs e)
        {

        }
    }

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