如何获取MAUI UI元素绝对坐标?弹窗定位适配问题
MAUI WinUI平台获取元素坐标返回(0,0)的问题解决
问题背景
开发MAUI应用时,需要在触发弹窗的按钮位置显示弹窗,基于AbsoluteLayout的弹窗定位代码正常,但获取元素坐标时遇到问题:原Xamarin UWP中可用的代码转换到MAUI后返回(0,0)。
原Xamarin UWP工作代码
var renderer = xForms.Platform.UWP.Platform.GetRenderer(element); var nativeView = renderer.GetNativeElement(); var element_Visual_Relative = nativeView.TransformToVisual(Window.Current.Content); Point point = element_Visual_Relative.TransformPoint(new Point(0, 0)); return new System.Drawing.PointF((int)Math.Round(point.X), (int)Math.Round(point.Y));
转换后MAUI无效代码(返回(0,0))
var frameworkElement = element.ToPlatform(MauiProgram.Context); var platformView = (Microsoft.UI.Xaml.Window)App.Windows.First().Handler.PlatformView; var visualRelativePoint = frameworkElement.TransformToVisual(platformView.Content); var point = visualRelativePoint.TransformPoint(new Windows.Foundation.Point(0, 0)); return new Point((int)Math.Round(point.X), (int)Math.Round(point.Y));
有效解决方案(含导航栏高度适配)
调整代码后已验证可正常获取坐标,同时优化了NavigationBar高度的偏移计算,代码如下:
using uiXaml = Microsoft.UI.Xaml; public override Point GetElementCoordinates(VisualElement element){ var nativeWindow = (uiXaml.Window)App.Current.Windows.First().Handler.PlatformView; var nativeElement = (uiXaml.UIElement)element.Handler.PlatformView; var coordinates = nativeElement.TransformToVisual(nativeWindow.Content) .TransformPoint(new Windows.Foundation.Point(0, 0)); var navBarHeight = (App.Current.MainPage is NavigationPage navPage && navPage.CurrentPage != null) ? navPage.Height - navPage.CurrentPage.Height : 0; return new Point((int)Math.Round(coordinates.X), (int)Math.Round(coordinates.Y - navBarHeight)); }
问题根源
原MAUI代码错误使用element.ToPlatform(MauiProgram.Context)获取原生控件,MAUI中应通过element.Handler.PlatformView获取对应的WinUI原生UIElement;同时确保坐标转换的参照容器是正确的窗口根内容,才能计算出准确的相对坐标。
内容的提问来源于stack exchange,提问作者Olograph
相关产品推荐
相关产品推荐

