在Windows上,当显示缩放高于100% 时,.NET MAUI Blazor Hybrid窗口底部区域的鼠标滚轮就无法滚动
在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项目是手动组装的,值得对比你现有的文件清单与新生成的模板——这类约定文件在运行时会改变行为,而代码中不需要引用它们。