.net maui 中的自定义控件和渲染器会发生啥?

Posted

技术标签:

【中文标题】.net maui 中的自定义控件和渲染器会发生啥?【英文标题】:What will happen to custom controls and Renderers in .net maui?.net maui 中的自定义控件和渲染器会发生什么? 【发布时间】:2021-10-13 20:47:12 【问题描述】:

在我当前的 Xamarin.Forms 项目中,我为不同的需求创建了许多渲染器。现在在 9 月,毛伊岛即将到来,我们必须将我们的项目迁移到那里。那么,渲染器会发生什么?它会按原样工作还是我们不需要渲染器?

【问题讨论】:

惊喜! youtube.com/watch?v=_EKznvARe8o 感谢分享@Shaw :D 【参考方案1】:

在 .NET MAUI 中,渲染器的概念将消失,取而代之的是处理程序架构。渲染器与实际控件和支持的平台的耦合过于紧密,最重要的是(或者可能正因为如此)它们依赖于反射等,速度很慢。

.NET MAUI 如此令人兴奋的很大一部分原因在于整个架构将会发生变化。现在,将有处理程序代替渲染器,它们基本上一次处理一个属性,并且在处理程序和控件之间添加了一个抽象。这很重要,因为现在可以更轻松地实现后端(想想 iosandroid,还有 SkiaSharp 或其他)。

至于您的问题:可能有不同的迁移路径。您可以按原样重用当前现有的自定义渲染器。代码更改应该非常少。 Xamarin.Forms/.NET MAUI 团队一直在努力实现兼容层来实现这一目标。但是,您从切换到 .NET MAUI 中获得的好处有限,但是它将为您争取一些时间来重写这些渲染器,并且仍然能够发布您的应用程序。虽然应该有足够的时间,但在 2022 年 11 月之前仍然支持 Xamarin.Forms。

无需过多介绍技术细节,在 .NET MAUI 项目的 Startup.cs 类中重用当前渲染器可能如下所示(完整代码 here):


public void Configure(IAppHostBuilder appBuilder)

    appBuilder
        .UseMauiApp<App>()
        .ConfigureMauiHandlers(handlers =>
              
#if __ANDROID__
        handlers.AddCompatibilityRenderer(typeof(Label), typeof(MAUICustomRendererSample.Platforms.Android.MyLabelRenderer));
#endif
        )
        .ConfigureFonts(fonts =>
        
            fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
        );

那么,当然,仍然有可能覆盖处理程序的行为。根据您的需要,有多种方法可以做到这一点。只覆盖一个属性,现在比渲染器时代容易得多。例如,看看下面的代码来改变按钮的背景颜色(完整代码here):

public void Configure(IAppHostBuilder appBuilder)

    appBuilder
        .UseMauiApp<App>()
        .ConfigureFonts(fonts =>
        
            fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
        );

    #if __ANDROID__
                Microsoft.Maui.Handlers.ButtonHandler.ButtonMapper["MyCustomization"] = (handler, view) =>
                
                    handler.NativeView.SetBackgroundColor(Android.Graphics.Color.Green);
                ;
    #endif

要创建一个完整的自定义控件,工作量大致相同,只是方法不同。更多从 Forms 到 .NET MAUI 的转换示例可以在 this example 中找到,来自 Javier,他一直致力于 Forms 和现在的 .NET MAUI。大多数其他事情(行为、效果等)只不过是替换代码中的一些命名空间而已,它们都应该可以工作。

最重要的是有一个Upgrade Assistant,它将帮助您完成更改项目和重命名命名空间等大部分任务。更多信息可以在本月找到Community Standup session。

根据您可用的项目规模和时间/预算,我个人会首先使用 Forms 兼容层移植所有内容。这应该需要最少的努力。检查一切是否仍按预期工作,您应该能够继续前进。之后,开始用新的处理程序结构一一替换您的渲染器。

最后;请注意,您可能使用的所有第三方库也都需要为 .NET 6 和/或 .NET MAUI 做好准备,因此请务必在开始升级之前检查这些库。

其他值得关注的好资源是 the Docs,正在开发中。

【讨论】:

以上是关于.net maui 中的自定义控件和渲染器会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

MAUI 自定义绘图入门

MAUI 自定义绘图入门

.NET Maui 自定义处理程序将参数从 xaml 代码传递到处理程序代码?

在 .NET MAUI 中如何更好地自定义控件

做一个高德地图的 iOS / Android .NET MAUI 控件系列 - 创建控件

MAUI 移植 Xamarin.Forms 自定义渲染器