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

.NET MAUI(iOS/.NET 8)自定义Entry下划线问题求助

解决.NET MAUI iOS自定义Entry下划线时View宽高为-1的问题

你遇到的问题是因为在AppendToMapping映射阶段,MAUI的Entry控件还未完成布局流程,此时view.Width和view.Height会返回初始值-1,导致下划线无法正确渲染。下面提供两种可靠的解决方案:

方案一:监听iOS原生控件的布局完成事件

直接监听UITextField的LayoutSubviews事件——这是iOS原生控件完成布局、确定自身尺寸的时机,此时获取Bounds能拿到准确的宽高:

Microsoft.Maui.Handlers.EntryHandler.Mapper.AppendToMapping("MyEntry", (handler, view) => {
#if __IOS__
    handler.PlatformView.BorderStyle = UITextBorderStyle.None;
    var borderLayer = new CALayer();
    borderLayer.MasksToBounds = true;
    borderLayer.BorderColor = view.TextColor.ToCGColor();
    borderLayer.BorderWidth = 1.0f;
    handler.PlatformView.Layer.AddSublayer(borderLayer);

    // 监听布局完成事件,动态更新下划线位置和宽度
    handler.PlatformView.LayoutSubviews += (sender, e) => {
        if (sender is UITextField textField)
        {
            borderLayer.Frame = new CoreGraphics.CGRect(0, textField.Bounds.Height - 1, textField.Bounds.Width, 1);
        }
    };
#endif
});

方案二:监听MAUI View的尺寸变化事件

利用MAUI控件的SizeChanged事件,当控件尺寸确定后再更新下划线的Frame:

Microsoft.Maui.Handlers.EntryHandler.Mapper.AppendToMapping("MyEntry", (handler, view) => {
#if __IOS__
    handler.PlatformView.BorderStyle = UITextBorderStyle.None;
    var borderLayer = new CALayer();
    borderLayer.MasksToBounds = true;
    borderLayer.BorderColor = view.TextColor.ToCGColor();
    borderLayer.BorderWidth = 1.0f;
    handler.PlatformView.Layer.AddSublayer(borderLayer);

    // 监听MAUI控件尺寸变化,确保宽高有效时更新下划线
    view.SizeChanged += (sender, e) => {
        if (view.Width > 0 && view.Height > 0)
        {
            borderLayer.Frame = new CoreGraphics.CGRect(0, view.Height - 1, view.Width, 1);
        }
    };
#endif
});

注意事项

  • 优先选择方案一,直接基于iOS原生控件的布局事件,能更及时准确地获取控件实际尺寸,避免MAUI与原生控件尺寸同步的延迟问题。
  • 不要在AppendToMapping阶段直接使用view.Width或view.Height,此时控件未完成布局,这些值都是无效的初始值。

内容的提问来源于stack exchange,提问作者Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 10:07:27