简介

众所周知, .NET MAUI使用的是Handler处理程序, 而Xamarin使用的则是Render渲染器模式。尽管MAUI中使用了新的渲染模式, 但是仍然Xamarin中的支持Render渲染器, 这意味着如果你的项目是从Xamarin移植到MAUI当中, 大部分代码能够可以重用, 本篇文章介绍如何将Xamarin 渲染器(Render)移植到.NET MAUI项目当中。

先决条件

为了还原本次测试环境, 下面说明了本次测试的开发环境, 如下:

IDE: Visual Studio Community 2022 Preview (64 位) 17.0.0 Preview 7.0
操作系统: Windows 11家庭版 已安装Andoroid子系统(调试使用)
IDE 模块:安装Xamarin移动端开发环境及MAUI预览版环境

创建Xamarin渲染器

  • 第一步: 首先创建一个Xamarin.Forms项目, 在Android项目中创建CustomRender文件夹, 并且创建自定义渲染器MyButtonRender, 如下所示:

说明: MyButtonRender类完整代码如下所示:

using Android.Content;
using App2.Droid.CustomRender;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using App2;[assembly: ExportRenderer(typeof(MyButton), typeof(MyButtonRender))]
namespace App2.Droid.CustomRender
{public class MyButtonRender : ButtonRenderer{public MyButtonRender(Context context) : base(context){}protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e){base.OnElementChanged(e);if(Control!= null){Control.SetBackgroundColor(global::Android.Graphics.Color.Red);}}}
}
  • 第二步:在类库项目App2中添加MyButton类,继承Button, 如下所示:

using Xamarin.Forms;namespace App2
{public class MyButton : Button{}
}
  • 第三步:在Xaml中使用MyButton, 如下所示:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="App2.Views.AboutPage"xmlns:my="clr-namespace:App2" ><Grid><!--此处略过许多代码--><my:MyButton Text="About!" /></Grid>
</ContentPage>
  • 第四步:启动Android项目,预览效果,如下所示:

说明:通过上面几步, 我们轻松的完成了在Xamarin当中自定义渲染器并且显示在模拟器当中, 接下来, 主要的任务是将Xamarin现有的
自定义渲染器移植到MAUI项目中, 那么下面接着继续表演。

渲染器移植至MAUI项目

  • 第一步: 这里, 直接创建名为MAUIRender的新MAUI项目。

  • 第二步: 然后, 我们把Xamarin中创建的MyButton与MyButtonRender直接复制到MAUI的项目中, 如下所示:

MyButtonRender类修改如下:

using App2;
using Android.Content;
using Microsoft.Maui.Controls.Platform;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Controls.Compatibility.Platform.Android.FastRenderers;namespace MAUIRender
{public class MyButtonRender : ButtonRenderer{public MyButtonRender(Context context) : base(context){}protected override void OnElementChanged(ElementChangedEventArgs<Button> e){base.OnElementChanged(e);if(Control!= null)Control.SetBackgroundColor(global::Android.Graphics.Color.Red);}}
}

说明: 此处更新涉及更新命名空间引用

移除旧的Xamarin引用:
using Xamarin.Forms.Platform.Android;
using Xamarin.Forms;

添加新的MAUI引用:
using Microsoft.Maui.Controls;
using Microsoft.Maui.Controls.Platform;
using Microsoft.Maui.Controls.Compatibility.Platform.Android.AppCompat;

移除 [assembly: ExportRenderer(typeof(MyButton), typeof(MyButtonRender))] (原因下面说)

MyButton类修改如下:

using Microsoft.Maui.Controls;namespace App2
{public class MyButton : Button{}
}

说明: using Xamarin.Forms; 更新为: using Microsoft.Maui.Controls;

  • 第三步: 依赖注入自定义的Render
    上面所讲到移除 [assembly: ExportRenderer(typeof(MyButton), typeof(MyButtonRender))] 声明,
    在Xamarin当中, 渲染器强制声明在Android项目中, 耦合性很强。这一点,在MAUI项目当中, 则是通过Startup类中依赖注入的形式添加,通过扩展方法 ConfigureMauiHandlers 添加 AddCompatibilityRenderer,如下所示:

public static MauiApp CreateMauiApp(){var builder = MauiApp.CreateBuilder();builder.UseMauiApp<App>().ConfigureFonts(fonts =>{fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");}).ConfigureMauiHandlers(handler =>{#if ANDROIDhandler.AddCompatibilityRenderer(typeof(MyButton), typeof(MyButtonRender));#endif});return builder.Build();}

说明: 之所以使用ANDROID 条件, 取决于我们并为定义IOS平台的自定义渲染器, 当然我们可以这么做, 如果当该渲染器仅仅为Android提供, 我们即可单独设置。

  • 第四步: XAML页面中添加MyButton命名空间, 声明MyBuToon, 如下所示:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="MAUIRender.MainPage"xmlns:my="clr-namespace:MAUIRender"BackgroundColor="{DynamicResource SecondaryColor}"><Grid><my:MyButton Text="Hello,MyButton!!!"HeightRequest="80"WidthRequest="300"HorizontalOptions="Center"/></Grid>
</ContentPage>

最终运行效果图,如下所示:

总结

这篇文章主要给大家介绍了如何将Xamarin Render移植到 .NET MAUI项目当中, 当然在新的MAUI当中,
仍然建议大家使用新的Handler处理程序来实现, 并且它提供了更好的性能以及灵活性。
下一篇, 主要给大家介绍, 如何在MAUI当中使用新的Handler体系来实现自定义平台控件。

MAUI 移植 Xamarin.Forms 自定义渲染器相关推荐

  1. C#使用Xamarin开发可移植移动应用进阶篇(6.使用渲染器针对单个平台自定义控件),附源码

    本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要.. 想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈... 今天的学习内容? ...

  2. Xamarin.Forms开发实战基础篇大学霸内部资料

    Xamarin.Forms开发实战基础篇大学霸内部资料 介绍:本教程是国内第一本Xamarin.Forms开发专向教程.本教程针对Xamarin.Forms初学用户,全面细致的讲解Xmarin.For ...

  3. xmarin.android导航栏,Xamarin.Forms中心标题和透明导航栏 - Android

    小智.. 9 我最近遇到同样的问题,我是用MasterDetailPage在Xamarin.Forms与Android中并不设置标题中心. 那么,显而易见的路线是创建一个自定义渲染器override及 ...

  4. Vue渲染器(一):渲染器的设计

    渲染器(一):渲染器的设计 1.前言: 接下来就开始详细讨论渲染器的实现细节了,这也是Vue.js中非常重要的一部分,很多功能依赖渲染器来实现,例如 Transition组件.Teleport组件.S ...

  5. 29.渲染器Renderer

    什么是渲染器 渲染器就是将服务器生成的数据格式转为http请求的格式 渲染器触发及参数配置 在DRF配置参数中,可用的渲染器作为一个类的列表进行定义 但与解析器不同的是,渲染器的列表是有顺序关系的 R ...

  6. C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码...

    原文:C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github. ...

  7. C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码

    本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要.. 想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈... 今天的学习内容? ...

  8. Go gin静态文件的使用、自定义模板渲染器

    Go gin静态文件的使用 一.指定静态文件路径 engine.Static("/static", "static") 第一个参数是url,第二个参数是url对 ...

  9. 自定义 Spark item 的渲染器

    在 DAtaGroup , SkinnableDataContainer 或它们的子类中定义自己的项目渲染器可以控制数据项的显示外观,数据项的外观包括字体.背景色.边界和其他的可视方面.项目渲染器也可 ...

最新文章

  1. 记一次面试经过-----映客
  2. 安装 RAILS ANNOTATE_MODELS 插件.
  3. 解决:按截图 ctrl+alt+a QQ聊天窗口就自动最小化(QQ以外的可以截图)
  4. 百度云域名解析如何添加? - [未完待续]
  5. kis显示用户登录服务器失败,金蝶KIS专业版提示用户KISAdmin登陆失败。原因:未与信任SQL Server连接相关联...
  6. 360宽带测速至少在我的网络环境里有设计缺陷
  7. 邮件传输协议 SMTP 、POP3 、IMAP 和 Exchange 比较及联系?
  8. js 手机或者座机电话号码验证
  9. Win10下VS2019 C++ opencv3.4.x 环境搭建过程 | 找不到opencv_world347d.dll | error LNK2019: 无法解析的外部符号
  10. vegan稀释曲线 基因丰度_基于OTU的稀释曲线(Rarefaction curves) + ggplot2
  11. 微型机器学习,会是下一代AI革命吗?
  12. Ubuntu和windows双系统并存条件下,在Windows系统内插耳机没有声音的问题
  13. 企查查app sign算法破解(完结)
  14. SAP ERP统驭科目
  15. sb3500_您的代码如何在3500万人的家庭中成为社会公益的代言人
  16. [Nikon D80]春芽
  17. 交易市场中的测不准原理
  18. 戴尔服务器电源炸机维修图,(转帖) 戴尔SE198WFPF E198WFPF电源电路电源芯片SG6841维修案例与分析...
  19. ASEMI整流模块MDA110-16参数,MDA110-16规格
  20. GoLang之schedule 循环如何启动(10)

热门文章

  1. CSS3中弹性盒布局的最新版
  2. win7开机按F8后,为什么没有修复计算机的选项
  3. 开放一些常见功能的工具类代码
  4. mysql-5.5.31主从复制
  5. 邮件服务器在企业网中的应用
  6. 认识mysql总结_从根上理解Mysql - 读后个人总结1-搜云库
  7. Delphi对话框初始地址InitialDir
  8. Android WebView和JavaScript交互
  9. 获取DataTable字段唯一值(DISTINCT)
  10. odoo 自定义视图_如何使用Windows的五个模板自定义文件夹视图