Blazor Hybrid问题:窗口移动后<option>列表位置不更新,重获焦点后恢复
MAUI Blazor Hybrid 原生下拉列表窗口移动后位置偏移问题
问题详情
用最新版MAUI开发Blazor Hybrid应用时遇到一个诡异问题:页面里的<select>(包括Blazor自带的<InputSelect>),在拖动窗口改变位置后,打开下拉选项列表时,列表会显示在错误的位置。但切到其他应用再切回来,位置又会恢复正常。
- 试过调用
StateHasChanged()、换用<InputSelect>都没用 - Blazor WASM环境下完全没这个问题
复现代码
<label>Select issue showcase.</label> <select> <option disabled hidden selected>Select something.</option> @foreach(int i in Enumerable.Range(0, 10)) { <option>@i</option> } </select>
临时解决办法
目前有两个可行的临时方案:
- 监听窗口位置变化,强制触发界面重绘
在MAUI项目的Windows平台代码里加个监听,窗口移动时强制更新布局:#if WINDOWS var currentWindow = App.Current.Windows.FirstOrDefault(); if (currentWindow?.Handler?.PlatformView is Microsoft.UI.Xaml.Window nativeWin) { nativeWin.PositionChanged += (sender, args) => { nativeWin.DispatcherQueue.TryEnqueue(() => { nativeWin.InvalidateMeasure(); nativeWin.UpdateLayout(); }); }; } #endif - 换用第三方Blazor下拉组件
比如MudBlazor的MudSelect、Radzen的RadzenDropDown,这类组件是纯Web渲染的,不依赖系统原生下拉控件,自然不会有位置同步问题
问题原因推测
本质是MAUI里的WebView和系统原生控件的布局同步bug:原生<select>的下拉列表是操作系统负责绘制的,不是WebView渲染的。窗口移动后,WebView没及时把新的窗口坐标同步给系统的下拉列表绘制逻辑,导致计算出的位置还是旧的。切应用时系统会重新计算所有控件布局,所以位置就对了。
内容的提问来源于stack exchange,提问作者IAmDrNoLIfe
相关产品推荐
相关产品推荐

