Win2D 学习系列(二): CanvasControl

  在第一篇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 Name="canvas" 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 Name="canvas" ClearColor="Blue"/>
     <Button Content="Invalidate" HorizontalAlignment="Center" Click="Button_Click" />
 </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

时间: 2024-12-16 08:30:07

Win2D 学习系列(二): CanvasControl的相关文章

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

ASP.NET MVC学习系列(二)-WebAPI请求(转)

转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax

Java学习系列(二十四)Java正则表达式详解

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/45501777 前言 正则表达式可以说是用来处理字符串的一把利器,它是一个专门匹配n个字符串的字符串模板,本质是查找和替换.在实例演示之前先了解一下Pattern.Matcher这两个工具类,Pattern:编译好的带匹配的模板(如:Pattern.compile("[a-z]{2}");/ / 取2个小写字母):Matcher:匹配目标字符串后产生的结果(如:pattern.m

Java I/O系统学习系列二:输入和输出

编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇文章:<<Java I/O系统学习系列一:File和RandomAccessFile>>中,我们讲到RandomAccessFile可以写入和读取文件,具备I/O功能,但是其只能针对文件,而I/O还涉及到很多其他场景比如网络.读取内存中的字符串等,所以Java类库中提供了一系列的类库来对其进行支持,也就是

Java学习系列(二十三)Java面向对象之内部类详解

一.前言 内部类也称寄生类,就是把一个类放在类里面(即内部类的上一级程序单元是类)定义,将其作为外部类的成员.内部类主要用几种定义形式:静态(static)内部类,非静态内部类,匿名内部类(也就是没有名字的寄生类).内部类的好处就是内部类可以直接外部类的(包括私有)成员,反之不能.下面我们通过一些实例来详细讲解一下Java中内部类的使用及几种定义形式的相互调用. 二.实例说明 (1)匿名内部类:当程序创建匿名内部类时,会立即创建匿名内部类(实现类)的实例. interface IBreathe

WCF学习系列二---【WCF Interview Questions – Part 2 翻译系列】

http://www.topwcftutorials.net/2012/09/wcf-faqs-part2.html WCF Interview Questions – Part 2 This WCF tutorial is part-2 in series of WCF Interview Questions. Other parts in this series can be found here. 这是WCF问答系列教程中的第二部分,其他部分可以在下面的链接中找到: WCF Service

MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化

上篇文章中 我们已经创建了EF4.1基于code first的例子  有了数据库 并初始化了一些数据  今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建详细页 首先 我们先在控制器下 添加详细页的方法 因为这篇文章后面要介绍持久对象声明周期的变化 所以在这里先看下有哪些状态 EF里一共有这五中生命状态类型 其实 看名字我们可以大概猜测出个一二三来~~  游离的 未改变的  新添加的  已删除的 修改的  但是是怎么变化的能 我们在后面的代码中实践与

Android学习系列(二)布局管理器之线性布局及其自定义实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39643669 LinearLayout是Android控件中的线性布局控件,它包含的子控件将以横向(HORIZONTAL)或竖向(VERTICAL)的方式排列,按照相对位置来排列所有的子控件及引用的布局容器.超过边界时,某些控件将缺失或消失.因此一个垂直列表的每一行只会有一个控件或者是引用的布局容器. 一.LinearLayout线性布局的相关属性说明: android:orientat

[jQuery学习系列二 ]2-JQuery学习二-数组操作

前言 上一篇内容 已经对于Jquery 有了一些认识, 包括Jquery的选择器和DOM对象, 那么这一篇继续来看下Jquery中很实用的Jquery对于数组的操作. Jquery中对数组的操作大致有以下几种形式:each(迭代), map(转换), grep(筛选), 合并等. 1,迭代(each)jQuery.each( object, callback ) 返回值:Object说明:通用例遍方法,可用于例遍对象和数组.注意: 传入的第一个参数可以是数组或者对象.如果数组,则遍历数组中的每一