我正在尝试重用 Xamarin.Forms 中的现有 PageRenderer
项目,采用迁移后的应用程序形式。
当页面开始加载时,我收到堆栈溢出异常:
Java.Interop.NativeMethods.java_interop_jnienv_call_nonvirtual_void_method_a 中的 0x39 C# /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/obj/Release/net7.0/JniEnvironment.g 处的 Java.Interop.JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod 中的 0x74 .cs:12320,4 C# Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeNonvirtualVoidMethod 中的 0x2D /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:93 ,6 C# Android.Views.ViewGroup.Layout 中的 0x69 /Users/runner/work/1/s/xamarin-android/src/Mono.Android/obj/Release/net7.0/android-33/mcw/Android.Views.ViewGroup .cs:3369,5 C# 0xD4 在 Microsoft.Maui.ViewHandlerExtensions.PlatformArrangeHandler 位于 D: _work \s\src\Core\src\Handlers\ViewHandlerExtensions.Android.cs:133,4 C# 0x2 在 Microsoft.Maui.Handlers.ViewHandler
.PlatformArrange 位于 D: _work \s\src\Core\src\Handlers\View\ViewHandlerOfT.Android.cs:15,4 C# 0x37 在 Microsoft.Maui.Controls.Compatibility.RendererToHandlerShim.PlatformArrange 位于 D: _work \s\src\Compatibility\Core\src\RendererToHandlerShim.Android.cs:51,4 C# 0x1F 在 Microsoft.Maui.Controls.ContentPage.ArrangeOverride 位于 D: _work \s\src\Controls\src\Core\HandlerImpl\ContentPage.Impl.cs:22,4 C# 0x2 在 Microsoft.Maui.Controls.VisualElement.Microsoft.Maui.IView.Arrange 位于 D: _work \s\src\Controls\src\Core\HandlerImpl\VisualElement\VisualElement.Impl.cs:111,4 C# 0x4F 在 Microsoft.Maui.Controls.Compatibility.Platform.Android.PageRenderer.OnLayout 位于 D: _work \s\src\Compatibility\Core\src\Android\Renderers\PageRenderer.cs:169,4 C# 0x10 在 Microsoft.Maui.MauiViewGroup.n_OnLayout_ZIIII 位于 D: _work \s\src\Core\src\obj\Release et7.0-android\ generated\src\Microsoft.Maui.MauiViewGroup.cs:206,4 C# Android.Runtime.JNINativeWrapper.Wrap_JniMarshal_PPZIIII_V 中的 0x11 位于 /Users/runner/work/1/s/xamarin-android/src/Mono.Android/Android.Runtime/JNINativeWrapper.g.cs:429,5 C#
我尝试注释渲染器的代码,但没有帮助:
using Android.Content;
using System;
using Microsoft.Maui.Controls.Platform;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Controls.Compatibility.Platform.Android;
using PetActivityMobile.Core;
using Microsoft.Maui.Controls.PlatformConfiguration.AndroidSpecific;
namespace PetActivityMobile.Droid.Renderers
{
public class CreateAccountViewRenderer : PageRenderer
{
private bool _initialized;
private Page _page;
public CreateAccountViewRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
{
if (!_initialized && e?.NewElement != null)
{
_initialized = true;
_page = e.NewElement;
//The appearing event invoke before OnElementChanged called.
//So I'm changing the keyboard behavior also here for the first time when page up.
App.Current.On<Microsoft.Maui.Controls.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Pan);
_page.Appearing -= OnAppearing;
_page.Appearing += OnAppearing;
_page.Disappearing -= OnDisappearing;
_page.Disappearing += OnDisappearing;
}
}
protected override void OnDetachedFromWindow()
{
_page.Appearing -= OnAppearing;
_page.Disappearing -= OnDisappearing;
_initialized = false;
}
private void OnAppearing(object sender, EventArgs e)
{
App.Current.On<Microsoft.Maui.Controls.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Pan);
}
private void OnDisappearing(object sender, EventArgs e)
{
App.Current.On<Microsoft.Maui.Controls.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize);
}
}
}
我将它包含在我的 Android 项目中,如下所示:
private void RegisterRenderers(MauiAppBuilder mauiApp)
{
mauiApp.ConfigureMauiHandlers((handlers) =>
{
handlers.AddCompatibilityRenderer(typeof(MyEntry), typeof(MyRenderer));
handlers.AddCompatibilityRenderer(typeof(CreateAccountView), typeof(CreateAccountViewRenderer));
});
}
Entry 的渲染器工作正常。
有人也尝试过重用毛伊岛 xamarin.forms 的页面渲染器吗?
由于
PageRenderer
在毛伊岛已过时,您可以尝试使用相应的处理程序/映射器。
您可以参考以下Handler:
public class ContentPageHandler : Microsoft.Maui.Handlers.PageHandler
{
protected override void ConnectHandler(Microsoft.Maui.Platform.ContentView nativeView)
{
base.ConnectHandler(nativeView);
ContentPage.Loaded += OnLoaded;
}
protected override void DisconnectHandler(Microsoft.Maui.Platform.ContentView nativeView)
{
ContentPage.Loaded -= OnLoaded;
base.DisconnectHandler(nativeView);
}
ContentPage ContentPage => VirtualView as ContentPage;
void OnLoaded(object sender, EventArgs e) => ConfigureInteractivePopGesture();
void ConfigureInteractivePopGesture()
{
if (this is IPlatformViewHandler handler && handler.ViewController?.ParentViewController?.NavigationController is UIKit.UINavigationController navControler)
{
navControler.NavigationBarHidden = true;
navControler.InteractivePopGestureRecognizer.Delegate = new GestureRecognizerDelegate();
navControler.InteractivePopGestureRecognizer.Enabled = true;
}
}
}
public class GestureRecognizerDelegate : Foundation.NSObject, UIKit.IUIGestureRecognizerDelegate
{
}
并在
MauiProgram.cs
中注册:
public static MauiApp CreateMauiApp()
{
return MauiApp.CreateBuilder()
.UseMauiApp<App>()
#if IOS
.ConfigureMauiHandlers(handlers =>
{
handlers.AddHandler(typeof(ContentPage), typeof(ContentPageHandler));
})
#endif
.Build();
}
注:
1.有一个关于此的已知问题,您可以在这里检查:PageRenderer 兼容性未渲染页面内容。
2.有关更多信息,请查看文档:将 Xamarin.Forms 自定义渲染器迁移到 .NET MAUI 处理程序