在Windows上,当显示缩放高于100% 时,.NET MAUI Blazor Hybrid窗口底部区域的鼠标滚轮就无法滚动

移动开发 2026-07-08

在Windows的 .NET MAUI Blazor Hybrid应用(WebView2)中,鼠标滚轮滚动在窗口底部的一条水平带区域停止工作。其他一切仍然在那儿工作——鼠标移动、点击、键盘滚动、拖动滚动条——只有滚轮失效,而且仅在该区域。

我已经确认:

  • 死区是窗口高度的一个固定比例:在Windows显示缩放为125% 时,它是窗口底部的20%;调整窗口大小时,死区会按比例重新调整。在100% 显示缩放时,问题会瞬间消失(无需重启应用);回到125% 时,问题会重新出现。

  • 它是相对于窗口的,而非与内容相关:在任何页面上的同一带都存在死区,即使指针下方是纯文本,亦不受影响。

  • wheel 的被动捕获阶段对 document 的监听在死区内没有接收到任何事件(而 mousemove 事件仍在继续到来),因此事件在到达渲染器之前就被丢弃——没有可行的JavaScript解决方法。

  • 在普通的Edge/Chrome窗口中的相同页面没有问题,且同一个应用在Android上也没有问题。

原因是什么?

解决方案

应用缺少 Platforms/Windows/app.manifest —— 这是stock MAUI模板随附的文件,其核心内容声明了对每个监视器DPI的感知:

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="MyApp.WinUI.app"/>
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor</dpiAwareness>
    </windowsSettings>
  </application>
</assembly>

没有这个manifest,进程就不会以PerMonitorV2 DPI感知来运行,WinUI / WebView2的输入管线会把滚轮坐标映错:在显示缩放为 s 时,窗口底部的 1 − 1/s 区域的滚轮输入(125% 时为20%,150% 时为33%)被映射到WebView的输入区域之外并被静默丢弃。鼠标移动和点击走的是另一条路径,未受影响,这也是该症状如此令人困惑的原因。

该项目是手动创建的,而不是来自 dotnet new maui-blazor,因此这一个文件从未被带入。恢复它(并确认构建的 .exe 包含字符串 PerMonitorV2)即可完全修复滚轮输入。

你可以从一个健康的应用程序中复现该问题,方法相反:从stock maui-blazor 模板中删除 Platforms/Windows/app.manifest,在显示缩放为125% 的显示器上运行,并在窗口底部五分之一处滚动滚轮。

如果你的MAUI项目是手动组装的,值得对比你现有的文件清单与新生成的模板——这类约定文件在运行时会改变行为,而代码中不需要引用它们。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章