canvas教程

Win2D 学习系列(二): CanvasControl

字号+ 作者:H5之家 来源:H5之家 2015-10-03 09:47 我要评论( )

在第一篇Hello Win2D中,我们初步使用CanvasControl进行了文字的绘制,CanvasControl作为win2d中最重要的一个类,提供的功能自然也不仅仅是绘制文字,那么今天就来深入学习一下CanvasControl的前世今生。 在api文档中可以看到CanvasControl的继承关系: publ

  在第一篇Hello Win2D中,我们初步使用CanvasControl进行了文字的绘制,CanvasControl作为win2d中最重要的一个类,提供的功能自然也不仅仅是绘制文字,那么今天就来深入学习一下CanvasControl的前世今生。

  在api文档中可以看到CanvasControl的继承关系:

public sealed class CanvasControl : UserControl, ICanvasControl, ICanvasResourceCreatorWithDpi, ICanvasResourceCreator

  熟悉XAML的同学都知道,继承自UserControl的自定义控件和普通XAML控件一样,可以添加进XAML界面布局中,也拥有普通XAML控件同样的事件和属性。这样就很好理解上一篇中在XAML中添加CanvasControl并作为绘制的入口。那么Draw事件又是从何而来呢?且来看ICanvasControl:

  

internal interface ICanvasControl : ICanvasResourceCreatorWithDpi, ICanvasResourceCreator { Color ClearColor { get; set; } bool ReadyToDraw { get; } event TypedEventHandler<CanvasControl, CanvasCreateResourcesEventArgs> CreateResources; event TypedEventHandler<CanvasControl, CanvasDrawEventArgs> Draw; void Invalidate(); }

  ICanvasControl同样继承自ICanvasResourceCreatorWithDpi和ICanvasResourceCreator,关于这两个接口我在后面会讲。这里只看ICanvasControl的定义。首先来看ClearColor属性,来指定CanvasControl进行重绘时的背景颜色,在Demo中新建Page2,在Page2.xaml中添加CanvasControl,指定ClearColor属性:

  

<Page x:Class="App1.Page2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:App1" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:canvas="using:Microsoft.Graphics.Canvas" mc:Ignorable="d"> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <canvas:CanvasControl ClearColor="Blue"/> </Grid> </Page>

  然后 ReadyToDraw的返回值标记是否创建了绘图设备(Win2D使用GPU进行绘图,后面会单独写一篇文章来说,这里不深入了解), CreateResources和Draw是实现ICanvasControl接口的控件独有的事件,CreateResources事件在CanvasControl创建完成后触发,Draw事件中负责进行绘制。和普通XAML控件不一样的地方在于,CanvasControl的Loaded事件并不会初始化绘图设备,所以使用CanvasControl绘图使用的资源需要放在CreateResources事件中创建和初始化。来看下面的代码:

public Page2() { this.InitializeComponent(); canvas.Loaded += canvas_Loaded; canvas.CreateResources += canvas_CreateResources; } private async void canvas_Loaded(object sender, RoutedEventArgs e) { if (canvas.ReadyToDraw) { MessageDialog dialog = new MessageDialog("CanvasControl绘图设备在Loaded事件中创建"); await dialog.ShowAsync(); } } private async void canvas_CreateResources(CanvasControl sender, CanvasCreateResourcesEventArgs args) { if (canvas.ReadyToDraw) { MessageDialog dialog = new MessageDialog("CanvasControl绘图设备在CreateResources事件中创建"); await dialog.ShowAsync(); } }

运行结果:

  最后,我们来看一下Invalidate方法。Invalidate方法会重新调用Draw事件对CanvasControl的内容进行重绘。Demo代码如下:

  

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <canvas:CanvasControl ClearColor="Blue"/> <Button Content="Invalidate" HorizontalAlignment="Center" /> </Grid>

  在Page2.xaml.cs中注册CanvasControl的Draw事件,在Button的Clieck的事件中调用Invalidate方法:

  

int Index = 0; public Page2() { this.InitializeComponent(); canvas.Loaded += canvas_Loaded; canvas.CreateResources += canvas_CreateResources; canvas.Draw += canvas_Draw; } private void canvas_Draw(CanvasControl sender, CanvasDrawEventArgs args) { Index++; CanvasDrawingSession ds = args.DrawingSession; ds.DrawText(Index.ToString(), new System.Numerics.Vector2(180, 180), Colors.White); } private void Button_Click(object sender, RoutedEventArgs e) { canvas.Invalidate(); }

  

    Demo下载:https://github.com/leandro-lua/Win2dStudyDemo

  附录:

  1,微软win2D团队博客:Win2D Team Blog

  2,api文档:Win2D Documentation

  3,Win2D源码可以在Github下载:https://github.com/Microsoft/Win2D

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 学习慕课网canvas倒计时实例笔记

    学习慕课网canvas倒计时实例笔记

    2017-04-30 14:01

  • (F&C ZEXCS制作的系列作品)

    (F&C ZEXCS制作的系列作品)

    2017-04-30 13:01

  • 从一个画板demo学习canvas

    从一个画板demo学习canvas

    2017-04-30 13:00

  • canvas游戏开发学习之四:应用图像

    canvas游戏开发学习之四:应用图像

    2017-04-29 16:00

网友点评
a