在 Maui 中自绘组件1:绘制
在 Maui 中自绘组件 系列文章已完结,共六篇,此为第一篇。
在这篇文章中,将自定义一个简单的按钮组件,绘制边框、背景、文字元素。
GraphicsView
Maui 中提供了 GraphicsView 视图,可通过继承 GraphicsView 视图来自定义组件。
GraphicsView 中定义了类型为 IDrawable 的属性,在渲染时,将调用 IDrawable 中的 Draw 方法来绘制组件。
创建 MagicButtonDrawable
新建一个空的 Maui 项目,在项目根目录下创建 Components 文件夹,在其中创建 MagicButtonDrawable 类,并继承 IDrawable。MagicButtonDrawable 将负责自定义组件的绘制。
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();
}
在此方法中调用了 ICanvas 的 FillRoundedRectangle 方法,绘制了一个填充色为 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坐标都加上边框的宽度, 并将宽度和高度都减去两个边框的厚度,来进行绘制,即可得到底层一个大的圆角矩形,其上一个略小的圆角矩形,从而实现边框的效果。
dirtyRect的X和Y为绘制区域的左上角坐标,在canvas上进行绘制将根据dirtyRect的X和Y从左上角开始绘制。
绘制文本
定义方法 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:绘制的更多相关文章
- 杂谈SharpDx中的WIC组件——我们需要WIC的图片编码功能么?
在前文 SharpDX之Direct2D教程II——加载位图文件和保存位图文件 中,发现在VB2010中不能很好的运用SharpDx中的WIC组件进行图片的编码工作.可能是我的设置问题,也可能是Sha ...
- 转载:QTableView中嵌入可视化组件
出处:http://qimo601.iteye.com/blog/1538364 QTableView中嵌入可视化组件方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简 ...
- 上传图片时,使用GDI+中重绘方式将CMYK图片转为RGB图片
原文:上传图片时,使用GDI+中重绘方式将CMYK图片转为RGB图片 我们知道,如果网站上传图片时,如果用户上传的是CMYK图片,那么在网站上将是无法显示的,通常的现象是出现一个红叉.下面使用将Ima ...
- [MAUI] 在.NET MAUI中结合Vue实现混合开发
在MAUI微软的官方方案是使用Blazor开发,但是当前市场大多数的Web项目使用Vue,React等技术构建,如果我们没法绕过已经积累的技术,用Blazor重写整个项目并不现实. Vue是当前流 ...
- 在MAUI中使用Masa Blazor
Masa Blazor是什么 在此之前我们已经介绍过什么是Masa Blazor,以及如何使用Masa Balzor,如果还有不了解Masa Blazor的同学可以看我上篇文章[初识Masa Blaz ...
- 使用 MAUI 在 Windows 和 Linux 上绘制 PPT 的图表
我在做一个图表工具软件,这个软件使用 MAUI 开发.我的需求是图表的内容需要和 PPT 的图表对接,需要用到 OpenXML 解析 PPT 内容,读取到 PPT 图表元素的内容,接着使用 MAUI ...
- Bootstrap 中的 Typeahead 组件 -- AutoComplete
Bootstrap 中的 Typeahead 组件就是通常所说的自动完成 AutoComplete,功能很强大,但是,使用上并不太方便.这里我们将介绍一下这个组件的使用. 第一,简单使用 首先,最简单 ...
- WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常
WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常 在wpf中封装Com组件时,调用组件 ...
- Titanium中调用ios组件时语言不是本地化的解决方法
用Titanium开发的ios应用中,当调用系统组件时,尽管手机已经设置了系统语言为中文,但那些组件的界面却仍为英文.比如调用iphone中的相册组件,其界面为: 那么怎么让它跟系统语言保持一致呢? ...
- 第30课 Qt中的文本编辑组件
1. 3种常用的文本编辑组件的比较 单行文本支持 多行文本支持 自定义格式支持 富文本支持 QLineEdit (单行文本编辑组件) Yes No No No QPlainTextEdit (多行普通 ...
随机推荐
- 转载:java中DAO层、Service层、Control层的说明
转自:https://blog.csdn.net/qq_22771739/article/details/82344336?utm_source=blogxgwz6 DAO层:DAO层叫数据访问层,全 ...
- vue3 vite等笔记
1.脚手架 vue-cli基于webpack封装,生态非常强大,可配置性也非常高,几乎能够满足前端工程化的所有要求.缺点就是配置复杂,甚至有公司有专门的webpack工程师专门做配置,另外就是webp ...
- git 本地电脑重新装git后 更新github项目报错 fatal: detected dubious ownership in repository at
解决方法参考: fatal: detected dubious ownership in repository at 'D:/'之解决方法 1.今天在学习git的时候出现这个错误: 2.执行下面代码即 ...
- 版图 shrink
先打开模拟部分的版图,然后在ciw 里面执行 dbCreateXFormPCell(geGetEditCellView() "libName") 然后在"libName& ...
- Java集合-LinkedHashSet
LinkedHashSet 重点: LinkedHashSet 不允许重复元素,与 HashSet的区别是:它是有序的 LinkedHashSet 底层结构是 数组table + 双向链表 [介绍] ...
- Lua监听事件观察者模式(多个监听者监听)
fireEvent 产生事件,创建协程分发(在registerEventListener注册过的事件中通过事件名字找到对应的信息,然后执行对应模块的OnEvent函数),多个地方都注册了同一个事件的话 ...
- 突然连不上虚拟机,本地网络里没有VMnet8
今天打开虚拟机,突然发现无法ping通网络了,但是能ping通虚拟机ip,打开我的window的网络适配器发现居然没有vmnet 8虚拟网卡了,防火墙什么的都设置好了,仍然不行,后来发现,在网络和共享 ...
- C# WPF 自学 MVVM简单介绍
一.MVVM介绍 MVVM是Model-View-ViewModel(模型-视图-视图模型)的缩写形式 1.View就是用xaml实现的界面,负责与用户交互,接收用户输入,把数据展现给用户. 2.Vi ...
- Pytest+allure+requests接口自动化
实现功能 测试数据隔离: 测试前后进行数据库备份/还原 接口直接的数据依赖: 需要B接口使用A接口响应中的某个字段作为参数 对接数据库: 讲数据库的查询结果可直接用于断言操作 动态多断言: 可(多个) ...
- python字符串拼接方式
一 .join(iterator),后面必须是可迭代对象,例如:字符串,列表,元组 testList = ["1","2"] print(",&quo ...