在 Maui 中自绘组件 系列文章已完结,共六篇,此为第一篇。

在这篇文章中,将自定义一个简单的按钮组件,绘制边框、背景、文字元素。

GraphicsView

Maui 中提供了 GraphicsView 视图,可通过继承 GraphicsView 视图来自定义组件。

GraphicsView 中定义了类型为 IDrawable 的属性,在渲染时,将调用 IDrawable 中的 Draw 方法来绘制组件。

创建 MagicButtonDrawable

新建一个空的 Maui 项目,在项目根目录下创建 Components 文件夹,在其中创建 MagicButtonDrawable 类,并继承 IDrawableMagicButtonDrawable 将负责自定义组件的绘制。

public class MagicButtonDrawable : IDrawable
{
public void Draw(ICanvas canvas, RectF dirtyRect)
{
}
}

绘制边框

定义方法 DrawStroke 来绘制边框:

public void DrawStroke(ICanvas canvas, RectF dirtyRect)
{
canvas.SaveState(); canvas.SetFillPaint(new SolidPaint(Brush.LightBlue.Color), dirtyRect); canvas.FillRoundedRectangle(dirtyRect.X, dirtyRect.Y, dirtyRect.Width, dirtyRect.Height, dirtyRect.Height / 2); canvas.RestoreState();
}

在此方法中调用了 ICanvasFillRoundedRectangle 方法,绘制了一个填充色为 LightBlue 的圆角矩形。下一步将在此矩形之上,再绘制一个宽高小于此图案的不同填充色的圆角矩形,来实现边框的效果。

绘制背景

定义方法 DrawBackground 来绘制背景:

public void DrawBackground(ICanvas canvas, RectF dirtyRect)
{
canvas.SaveState(); canvas.SetFillPaint(new SolidPaint(Brush.Blue.Color), dirtyRect); var strokeThickness = 3;
var x = dirtyRect.X + strokeThickness;
var y = dirtyRect.Y + strokeThickness;
var width = dirtyRect.Width - strokeThickness * 2;
var height = dirtyRect.Height - strokeThickness * 2; canvas.FillRoundedRectangle(x, y, width, height, height / 2); canvas.RestoreState();
}

将边框厚度设为3,那么将绘制起始点的 X、Y坐标都加上边框的宽度, 并将宽度和高度都减去两个边框的厚度,来进行绘制,即可得到底层一个大的圆角矩形,其上一个略小的圆角矩形,从而实现边框的效果。

dirtyRectXY 为绘制区域的左上角坐标,在 canvas 上进行绘制将根据 dirtyRectXY 从左上角开始绘制。

绘制文本

定义方法 DrawText 来绘制按钮中的文本内容:

public void DrawText(ICanvas canvas, RectF dirtyRect)
{
canvas.SaveState(); canvas.FontColor = Brush.White.Color;
canvas.FontSize = 16;
canvas.DrawString("Magic Button", dirtyRect.X, dirtyRect.Y, dirtyRect.Width, dirtyRect.Height,
HorizontalAlignment.Center,
VerticalAlignment.Center); canvas.RestoreState();
}

创建 MagicButton

Components 文件夹中创建 MagicButton 类,并继承 GraphicsView。通过构造函数将 Drawable 属性设置为 MagicButtonDrawable 的实例。

public class MagicButton : GraphicsView
{
public MagicButton()
{
Drawable = new MagicButtonDrawable();
}
}

使用 MagicButton

修改 MainPage.xaml 引用 MagicButton 名称空间,并添加 MagicButton 组件:


<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:components="clr-namespace:YOUR_MAGICBUTTON_NAMESPACE"
x:Class="YOUR_ROOT_NAMESAPCE.MainPage"> <ScrollView>
<VerticalStackLayout
Spacing="25"
Padding="30,0"
VerticalOptions="Center"> <!-- ...... --> <!--使用自定义的 MagicButton-->
<components:MagicButton
HeightRequest="50"
WidthRequest="150"></components:MagicButton> <Button
x:Name="CounterBtn"
Text="Click me"
SemanticProperties.Hint="Counts the number of times you click"
Clicked="OnCounterClicked"
HorizontalOptions="Center" /> </VerticalStackLayout>
</ScrollView> </ContentPage>

效果如下:

推荐阅读

源码获取

扫描下方二维码,关注公众号捕获异常,回复 maui 获取源码。

在 Maui 中自绘组件1:绘制的更多相关文章

  1. 杂谈SharpDx中的WIC组件——我们需要WIC的图片编码功能么?

    在前文 SharpDX之Direct2D教程II——加载位图文件和保存位图文件 中,发现在VB2010中不能很好的运用SharpDx中的WIC组件进行图片的编码工作.可能是我的设置问题,也可能是Sha ...

  2. 转载:QTableView中嵌入可视化组件

    出处:http://qimo601.iteye.com/blog/1538364 QTableView中嵌入可视化组件方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简 ...

  3. 上传图片时,使用GDI+中重绘方式将CMYK图片转为RGB图片

    原文:上传图片时,使用GDI+中重绘方式将CMYK图片转为RGB图片 我们知道,如果网站上传图片时,如果用户上传的是CMYK图片,那么在网站上将是无法显示的,通常的现象是出现一个红叉.下面使用将Ima ...

  4. [MAUI] 在.NET MAUI中结合Vue实现混合开发

    ​ 在MAUI微软的官方方案是使用Blazor开发,但是当前市场大多数的Web项目使用Vue,React等技术构建,如果我们没法绕过已经积累的技术,用Blazor重写整个项目并不现实. Vue是当前流 ...

  5. 在MAUI中使用Masa Blazor

    Masa Blazor是什么 在此之前我们已经介绍过什么是Masa Blazor,以及如何使用Masa Balzor,如果还有不了解Masa Blazor的同学可以看我上篇文章[初识Masa Blaz ...

  6. 使用 MAUI 在 Windows 和 Linux 上绘制 PPT 的图表

    我在做一个图表工具软件,这个软件使用 MAUI 开发.我的需求是图表的内容需要和 PPT 的图表对接,需要用到 OpenXML 解析 PPT 内容,读取到 PPT 图表元素的内容,接着使用 MAUI ...

  7. Bootstrap 中的 Typeahead 组件 -- AutoComplete

    Bootstrap 中的 Typeahead 组件就是通常所说的自动完成 AutoComplete,功能很强大,但是,使用上并不太方便.这里我们将介绍一下这个组件的使用. 第一,简单使用 首先,最简单 ...

  8. WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常

    WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常 在wpf中封装Com组件时,调用组件 ...

  9. Titanium中调用ios组件时语言不是本地化的解决方法

    用Titanium开发的ios应用中,当调用系统组件时,尽管手机已经设置了系统语言为中文,但那些组件的界面却仍为英文.比如调用iphone中的相册组件,其界面为: 那么怎么让它跟系统语言保持一致呢? ...

  10. 第30课 Qt中的文本编辑组件

    1. 3种常用的文本编辑组件的比较 单行文本支持 多行文本支持 自定义格式支持 富文本支持 QLineEdit (单行文本编辑组件) Yes No No No QPlainTextEdit (多行普通 ...

随机推荐

  1. 基于Java语言的编码问题了解

    基于Java语言的编码问题了解 以下仅为本人工作.学习过程中所接触到的内容,不足之处欢迎指出. 近两天使用maven的tomcat插件,以及使用非插件版的tomcat部署项目时遇到了乱码问题,在解决乱 ...

  2. Log4NET 日志分割删除与压缩解决思路(附源码)

    最近公司发现,日志产生的太多了,于是让我写个方法来解决,一开始是让我删除,后来想了想让我先压缩再删除文件夹,下面提供两个版本的源代码及简单使用. 注:这两个代码也是博主CV的网上然后修改的,如侵权,请 ...

  3. Cadvisor+prometheus+grafana

    部署Cadvisor [root@localhost ~]# docker run -d \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro ...

  4. 版图 shrink

    先打开模拟部分的版图,然后在ciw 里面执行 dbCreateXFormPCell(geGetEditCellView() "libName") 然后在"libName& ...

  5. Java-【Arrays类】和【System类】

    Arrays类 [基本介绍] JDK中提供了一个专门用于操作数组的工具类,即Arrays类,位于java util 中. 用前需导包:import java.util.Arrays; [常用方法] 返 ...

  6. js 获取年月日时分秒,星期

    getDate() { var date = new Date() // 获取时间 var year = date.getFullYear() // 获取年 var month = date.getM ...

  7. 【pyqtgraph】pyqtgraph可移动竖线LineSegmentROI的拖拽事件相关

    情景 Python+PyQt+pyqtgraph读取数据绘图,并在图像上添加了LineSegmentROI带handle的竖线(hanlde是为了RectROI的拖动),现要实现竖线可以直接拖动,并在 ...

  8. 学Java的第5天,今天做了个双色球系统

    今天是学JAVA的第5天,刚刚把方法学完,然后就在这做黑马的题. 用了一个多小时时间,把他的 这些题都做完了 但是最后一道题,这个双色球系统我感觉挺有意思的 我看到这个题,分析后感觉需要4种方法: 1 ...

  9. 【python】第二模块 步骤一 第一课、MySQL的介绍

    第一课.MySQL的介绍 一.课程介绍 1.1 课程介绍 学习目标 了解关系型数据库的重要性 为什么会出现关系型数据库? 有哪些常见的关系型数据库? 掌握MySQL的安装和配置 怎么安装MySQL数据 ...

  10. 狐漠漠养成日记 Cp.00001 开始养成计划

    开始养成计划 今天是我开始这个"狐漠漠养成计划"的第一天(划掉). 看来是昨天出门前忘记保存了,昨天写的几百字内容全都没有了,今天其实已经是计划开始的第二天了. 因为昨天晚上出去喝 ...