You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

鼠标指针进入MenuFlyoutSubItem时触发何种事件?需捕获其Text属性

解决MenuFlyoutSubItem悬停事件捕获Text属性的问题

其实你遇到的问题是因为MenuFlyoutSubItem的事件路由特性,但它本身确实支持PointerEntered事件,只是可能你没正确注册或者被内部元素拦截了。下面给你两种可靠的解决方案:

方案1:直接注册PointerEntered事件(静态/动态创建都适用)

不管你是在XAML里静态定义菜单,还是后台动态生成(比如你的DynamicMenuTest相关代码),都可以直接给MenuFlyoutSubItem绑定PointerEntered事件:

静态XAML示例:

<MenuFlyout>
    <MenuFlyoutSubItem Text="我的子菜单" PointerEntered="MenuFlyoutSubItem_Hovered">
        <MenuFlyoutItem Text="子菜单项1"/>
        <MenuFlyoutItem Text="子菜单项2"/>
    </MenuFlyoutSubItem>
</MenuFlyout>

动态生成代码示例:

// 动态创建子菜单
var subMenu = new MenuFlyoutSubItem
{
    Text = "动态生成的子菜单"
};
// 绑定悬停事件
subMenu.PointerEntered += MenuFlyoutSubItem_Hovered;

// 添加子菜单项
subMenu.Items.Add(new MenuFlyoutItem { Text = "动态子项1" });
// 将子菜单添加到主菜单中
mainMenu.Items.Add(subMenu);

事件处理程序:

private void MenuFlyoutSubItem_Hovered(object sender, PointerRoutedEventArgs e)
{
    // 将sender转换为MenuFlyoutSubItem实例
    if (sender is MenuFlyoutSubItem subItem)
    {
        // 直接获取Text属性
        string hoveredText = subItem.Text;
        // 这里写你的业务逻辑,比如输出到调试窗口或者更新UI
        System.Diagnostics.Debug.WriteLine($"鼠标悬停在子菜单:{hoveredText}");
    }
}

方案2:强制捕获已处理的事件(如果方案1没触发时用)

如果方案1没生效,大概率是MenuFlyoutSubItem内部的控件(比如默认模板里的ContentPresenter)先处理了PointerEntered事件,导致你的处理程序收不到。这时候可以用AddHandler方法强制捕获已处理的路由事件:

var subMenu = new MenuFlyoutSubItem { Text = "需要强制捕获的子菜单" };
// 第三个参数设为true,表示即使事件被内部元素处理,也会触发我们的处理程序
subMenu.AddHandler(UIElement.PointerEnteredEvent, new PointerEventHandler(MenuFlyoutSubItem_Hovered), true);

这个方法能确保你100%捕获到鼠标进入的事件,完美适配你“悬停就打开子菜单”的场景——事件会在子菜单展开前触发,你可以顺利拿到Text属性。


内容的提问来源于stack exchange,提问作者frostydog47

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:24:33