.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
相关产品推荐
相关产品推荐

