介绍
Win2D是一个易于使用的Windows运行时API,用于通过GPU加速进行即时模式2D图形渲染。C#,C ++和VB开发人员可以为Windows通用平台(UWP)编写应用程序。它利用Direct2D的功能,并与XAML和CoreWindow无缝集成。
创建您的项目:
- 转到“文件”->“新建”->“项目...”
- 创建一个“空白应用程序(通用Windows)”
将项目的“架构”选项设置为x86或 x64,而不是设置为Any CPU。Win2D是用C ++实现的,因此使用Win2D的项目需要针对特定的CPU体系结构。
添加Win2D NuGet软件包:
- 转到“工具”->“ NuGet软件包管理器”->“管理解决方案的NuGet软件包...”
- 在“在线搜索”框中键入“ Win2D”,然后按Enter
- 选择“ Win2D.uwp”软件包,然后单击“安装”,然后单击“确定”。
将CanvasControl添加到您的XAML页面:
- 在解决方案资源管理器中双击MainPage.xaml以打开XAML编辑器
- 在现有xmlns语句旁边 添加Microsoft.Graphics.Canvas.UI.Xaml命名空间:
xmlns:canvas="using:Microsoft.Graphics.Canvas.UI.Xaml"
- 在现有的Grid控件内添加CanvasControl:
<Grid>
<canvas:CanvasControl Draw="CanvasControl_Draw" ClearColor="CornflowerBlue"/>
</Grid>
然后添加一些Win2D绘图代码。
- 如果创建了C#项目,请编辑MainPage.xaml.cs:
private void CanvasControl_Draw(Microsoft.Graphics.Canvas.UI.Xaml.CanvasControl sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasDrawEventArgs args)
{
args.DrawingSession.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
args.DrawingSession.DrawText("Hello world!", 100, 100, Colors.Yellow);
}
资源释放
Xaml文件中添加 Unloaded 事件
<Page
x:Class="GanttChartApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:GanttChartApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:canvas= "using:Microsoft.Graphics.Canvas.UI.Xaml"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
Unloaded="Page_Unloaded">
<Grid>
<canvas:CanvasControl x:Name="canvasControl" Draw="canvasControl_Draw" CreateResources="canvasControl_CreateResources" />
</Grid>
</Page>
private void Page_Unloaded(object sender, RoutedEventArgs e)
{//释放资源
canvasControl.RemoveFromVisualTree();
canvasControl = null;
}
注意
- CanvasControl在资源加载完成后自动执行一次Draw事件,如果想重新触发Draw事件(也叫刷新画布),请用CanvasControl.Invalidate();
- CanvasVirtualControl刷新画布时,如果想全部刷新,用CanvasVirtualControl.Invalidate();如果想局部刷新,用CanvasVirtualControl.Invalidate(Rect);
- CanvasAnimatedControl的Update事件和Draw事件都是不断执行的,你把更新数据的方法写到哪里都行。但是Draw事件不加阻止的不断运行会非常消耗性能。建议在代码里加个bool IsDraw布尔变量,在Draw事件里加个if(IsDraw)来手动控制。