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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:24:44