Blazor 3.1 嵌套的 onmouseover 事件

Jam*_*ter 8 blazor blazor-client-side

我有一个嵌套 div 的问题,它们都有 onmouseover/onmouseout 事件。我有一个导航菜单,它从 onmouseover 事件触发的屏幕一侧弹出。在这个导航菜单中,我有一个弹出打开的子菜单,它也是由 onmouseover 事件触发的。两个打开事件独立工作正常,但是当一起运行时,触发器似乎被外部 div 拦截(外部 div 打开但内部 div 什么也不做)。

  • 我尝试在父 div 和子 div 上添加 @onmouseover:stopPropagation="true" ,但这没有任何效果。
  • 我知道有关于 onmouseenter/onmouseleave 的讨论与 Blazor 5 中的 html/js 类似,但 11 月还有很长的路要走,支持仍然悬而未决。

如果有我错过的技巧,请告诉我。代码如下(省略了 c# 代码 - 相应地修改了 collapseNavicationFlag 和 ExpandSubmenu 标志字符串。)

导航菜单

<div id="nav-bar" class="@collapseNavigationFlag" @onmouseover="ExpandNavigation" @onmouseout="CollapseNavigation">


<div>
    <ul class="nav flex-column">
        foreach (var navigationItem in navigationSection.NavigationItems)
        {
            <NavMenuSubmenu />
        }
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

导航菜单子菜单

<li>
    <ul class="nav-submenu @expandSubmenu"
        @onmouseover="ExpandSubmenu"
        @onmouseout="CollapseSubmenu">
        @foreach (var navigationSubItem in NavigationItem.NavigationSubItems)
        {
            <li class="nav-submenu-item px-3">
                <a href="@navigationSubItem.Page">
                    @navigationSubItem.Title
                </a>
            </li>
        }
    </ul>
</li>
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 13

参加聚会有点晚,但在网上搜寻解决方案后,我终于找到了一个。

在 Blazor 应用程序的顶层创建文件 EventHandlers.cs 并使用以下代码填充它:

[EventHandler("onmouseleave", typeof(MouseEventArgs), true, true)]
[EventHandler("onmouseenter", typeof(MouseEventArgs), true, true)]
public static class EventHandlers {
}
Run Code Online (Sandbox Code Playgroud)

现在您应该能够像使用 @onmouseout 等一样在 html 元素上声明事件回调。

<div id="nav-bar" class="@collapseNavigationFlag" @onmouseenter="ExpandNavigation" @onmouseleave="CollapseNavigation">
Run Code Online (Sandbox Code Playgroud)

这是一个非常不明显且看似无证的解决方案,我设法通过破译了一半回答的 Blazor 讨论拼凑起来。我不是 100% 确定该文件必须被称为 EventHandlers.cs,我可能没有尝试过,我也不是 100% 确定它必须放置在您的应用程序的顶层,我再次没有没试过

我很高兴终于让它工作了,不确定这种方法的稳定性,到目前为止没有遇到任何问题,但不能排除任何奇怪之处,因为我想有一个原因 Blazor 不直接支持 onmouseenter/onmouseleave盒子?

此问题还有另一种解决方法pointer-events:none;,在子元素的 css 上进行设置,但是此方法可防止出现任何交互性,例如选项的颜色更改鼠标滚动和该性质的事物。

希望这个答案可以帮助那些在开发交互式 web ui 时遇到同样问题的人,因为 onmouseenter 和 onmouseleave 是一些重要的功能。

  • 老实说@Major,这就像在黑暗中解决拼图游戏一样。我搜索了这样的 GitHub 问题:https://github.com/dotnet/aspnetcore/issues/13104,人们引用了解决方案,但实际上没有提供任何真正的细节,这使得实现起来极其困难。我从大约 4 到 5 个类似的不同来源将其拼凑在一起,并实际查看了 GitHub 上的 Blazor 源代码。 (2认同)