Xamarin渲染器移植到.NET MAUI项目中

简介

众所周知, .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 ANDROID
                handler.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体系来实现自定义平台控件。

到此这篇关于Xamarin渲染器移植到.NET MAUI项目中的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • MAUI项目中使用SnackBar与Toast通知功能

    介绍 本文中, 将介绍如何在MAUI项目当中使用SnackBar以及Toast通知功能, 通过添加 CommunityToolkit.Maui 包,来扩展MAUI功能. 首先, 创建MAUI项目, 并且安装 CommunityToolkit.Maui: <ItemGroup> <PackageReference Include="CommunityToolkit.Maui" Version="1.0.0-pre6" /> </ItemG

  • MAUI中实现构建跨平台原生控件

    简介 MAUI中使用Handler体系来处理不同平台的原生控件实现, 即对应的, 如果我们想要创建控件, 只需要创建基于不同平台的Handler即可. 那么下面主要教大家如何通过创建Handler(事件处理程序)来构建自己的控件. 开始 下面, 将通过创建一个进度条控件案例, 来演示如何在MAUI项目中创建平台控件并且使用它. 假设控件包含基础的三项功能, 进度条颜色(Foreground).进度条当前值(Value).进度条模式(Indeterminate) 1.第一步(声明控件类) 首先,

  • Three.js+React实现3D冰墩墩2022冬奥会主题

    目录 背景 效果 实现 引入资源 页面DOM结构 场景初始化 添加光源 加载进度管理 创建地面 创建冬奥吉祥物冰墩墩 创建奥运五环 TorusGeometry 圆环面 MeshLambertMaterial 非光泽表面材质 创建旗帜 创建树木 MeshDepthMaterial 深度网格材质 custromMaterial 自定义材质 创建雪花 Points 粒子 PointsMaterial 点材质 材质属性 .blending 材质属性 .sizeAttenuation Three.js 向

  • .NET跨平台应用MAUI介绍

    您可以使用 .NET 构建任何内容.这是数百万开发人员选择 .NET 作为其职业生涯的平台,以及公司为其业务进行投资的主要原因之一.通过 .NET 5,我们开始了统一 .NET 平台的旅程,将 .NET Core 和 Mono/Xamarin 整合在一个基类库 (BCL) 和工具链 (SDK) 中. 当我们考虑在统一的 .NET 中构建设备应用程序的外观时,我们看到许多设备跨多个平台使用,从 Android 和 iOS 到 Windows 和 macOS.为了满足这一需求,我们很高兴地宣布一个新

  • Xamarin渲染器移植到.NET MAUI项目中

    简介 众所周知, .NET MAUI使用的是Handler处理程序, 而Xamarin使用的则是Render渲染器模式.尽管MAUI中使用了新的渲染模式, 但是仍然Xamarin中的支持Render渲染器, 这意味着如果你的项目是从Xamarin移植到MAUI当中, 大部分代码能够可以重用, 本篇文章介绍如何将Xamarin 渲染器(Render)移植到.NET MAUI项目当中. 先决条件 为了还原本次测试环境, 下面分别列举了本次测试代码移植的开发测试环境, 如下所示: IDE: Visua

  • .NET MAUI项目中创建超链接

    .NET MAUI Preview 13预览版中,.NET MAUI 支持带标签控件的格式化文本. 标签中的格式化文本 标签是显示带或不带文本环绕的文本的视图.使用格式化文本功能(现在位于单个标签中),您可以使用不同的 span 元素为每个设置选择多个选项.例如,您可以对单个标签中的单词应用单独的颜色.这将使标签更具装饰性.Span 元素支持以下选项: CharacterSpacing FontAttributes FontFamily FontSize TextColor TextTransf

  • Spring Boot项目中定制拦截器的方法详解

    这篇文章主要介绍了Spring Boot项目中定制拦截器的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Servlet 过滤器属于Servlet API,和Spring关系不大.除了使用过滤器包装web请求,Spring MVC还提供HandlerInterceptor(拦截器)工具.根据文档,HandlerInterceptor的功能跟过滤器类似,但拦截器提供更精细的控制能力:在request被响应之前.request被响应之后.视

  • SSM项目中使用拦截器和过滤器的实现示例

    一.拦截器概述 Spring MVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定 的功能,自定义的拦截器必须实现 HandlerInterceptor 接口 preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理.如果程序员决定该拦截器对请求进行拦截处理后还要调用其他 的拦截器,或者是业务处理器去进行处理,则返回 true:如果程序员决定不需要 再调用其他的组件去处理请求,则返回 false. postHandle(

  • Java Swing中JTable渲染器与编辑器用法示例

    本文实例讲述了Java Swing中JTable渲染器与编辑器用法.分享给大家供大家参考,具体如下: JTable的内容.外观.事件响应在很大程度上是由渲染器与编辑器控制的.具体说来,渲染器负责单元格的外观比如前景色.背景色,以及单元格提示:编辑器负责单元格的内容和事件响应.编辑器默认为文本框形式,也可以使用下拉菜单.按钮.单选按钮等形式.下面通过一个demo程序来说明渲染器与编辑器的基本用法. JButtonTableExample.java package awtDemo; import j

  • Angular Renderer (渲染器)的具体使用

    Angular 其中的一个设计目标是使浏览器与 DOM 独立.DOM 是复杂的,因此使组件与它分离,会让我们的应用程序,更容易测试与重构.另外的好处是,由于这种解耦,使得我们的应用能够运行在其它平台 (比如:Node.js.WebWorkers.NativeScript 等). 为了能够支持跨平台,Angular 通过抽象层封装了不同平台的差异.比如定义了抽象类 Renderer.Renderer2 .抽象类 RootRenderer 等.此外还定义了以下引用类型:ElementRef.Temp

  • Django Rest framework解析器和渲染器详解

    解析器 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己想要的数据类型的过程. 本质就是对请求体中的数据进行解析. Content-type:用于声明我给你传的是什么类型的数据 application/x-ww-form-urlencoded 表单数据类型 multipart/form-data 文件 application/json(比如:request.body) Accept:用于声明我能解析什么样的数据类型 Django中的解析器 我们的请求进来后,请求体中的数据是保存在r

  • Android Shader着色器/渲染器的用法解析

    一.介绍 Shader是绘图过程中的着色器,它有五个子类: BitmapShader: 位图渲染 LinearGradient: 线性渲染 SweepGradient: 梯度渲染 RadialGradient: 光束渲染 ComposeShader: 组合渲染 渲染模式:Shader.TileMode Shader.TileMode.CLAMP: 边缘拉伸模式,它会拉伸边缘的一个像素来填充其他区域. Shader.TileMode.MIRROR: 镜像模式,通过镜像变化来填充其他区域.需要注意的

  • SpringBoot项目中的视图解析器问题(两种)

    前言:SpringBoot官网推荐使用HTML视图解析器,但是根据个人的具体业务也有可能使用到JSP视图解析器,所以这里我给大家简单介绍一下这两种视图解析器的具体使用 一.解析成JSP页面 1.在pom.xml文件中添加相关依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> &

随机推荐