C#使用Win2D在UWP程序中實(shí)現(xiàn)2D繪圖
在新的Windows UWP程序中,引入了一個(gè)新的API庫(kù): Win2D。它是一個(gè)d2d的封裝,可以直接使用C#來(lái)快速實(shí)現(xiàn)高效2D繪圖了。這個(gè)API雖然在Win8.1時(shí)代就開(kāi)始著手開(kāi)發(fā)了,但最近才完善了下來(lái)。本文這里就簡(jiǎn)單的介紹一下它的基本用法:
安裝
Win2D并不是Win10 SDK里面的一部分,需要從Nuget上安裝,在程序包管理器里直接安裝Win2D.uwp即可。
PM> Install-Package Win2D.uwp
這個(gè)是Win10下的庫(kù),Win8下需要使用Win2D.win81庫(kù)。安裝完后在Project.json中可以看到相應(yīng)的庫(kù)依賴:

示例:
Win2D引入了一個(gè)新的畫(huà)布:Microsoft.Graphics.Canvas.UI.Xaml.CanvasControl,所有的繪制必須在它上面進(jìn)行。因此首先在XAML中添加CanvasControl作為底圖:
xmlns:canvas="using:Microsoft.Graphics.Canvas.UI.Xaml"
<Grid>
<canvas:CanvasControl Draw="canvasControl_Draw" ClearColor="CornflowerBlue" />
</Grid>然后響應(yīng)其Draw事件,在里面添加繪制動(dòng)作:
void canvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
{
args.DrawingSession.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
args.DrawingSession.DrawText("Hello, world!", 100, 100, Colors.Yellow);
}運(yùn)行效果如下:

這種方式與WinForm和WPF中的自繪制比較像,只是一些API有些差異。
繪制API
前面使用了DrawingSesion下發(fā)繪制命令,和WPF中的DrawingContext差不多,就是一個(gè)繪制上下文。它主要的命令分為如下兩種:DrawXXX和FillXXX。DrawXXX只是繪制圖像,而FillXXX只填充圖像,這里和WPF那種繪制和填充在一個(gè)API里的方式稍稍有點(diǎn)不同。
由于API并不多,這里列舉了一下,基本上看著就知道怎么用了。
繪制圖像
DrawCircle
DrawCachedGeometry
DrawEllipse
DrawGeometry
DrawImage
DrawInk
DrawLine
DrawRectangle
DrawRoundedRectangle
DrawText。
DrawTextLayout
填充圖像
FillCircle
FillEllipse
FillGeometry
FillRectangle
FillRoundedRectangle
它的API還比較簡(jiǎn)單,基本上看著就知道怎么用,不過(guò)其中的DrawImage能傳入一個(gè)IcanvasImage類型,而這個(gè)類型并不僅僅是圖片,包括下面介紹的CanvasCommandList和Effect都是這種類型,使用的時(shí)候需要熟悉一下。
2D轉(zhuǎn)換
2D繪圖的過(guò)程中往往還伴隨著一些平移,旋轉(zhuǎn)等2D轉(zhuǎn)換的操作,DrawingSession中提供了一個(gè)Transform屬性可以傳入一個(gè)3*2矩陣實(shí)現(xiàn)2D轉(zhuǎn)換。
var ds = args.DrawingSession;
ds.Transform = Matrix3x2.CreateTranslation(new Vector2(200, 100));
ds.DrawText("A", 0, 0, Colors.White);
ds.Transform *= Matrix3x2.CreateRotation(12, new Vector2(200,80));
ds.DrawText("B", 0, 0, Colors.White);CanvasCommandList
CanvasCommandList可以緩存一組繪制命令,然后統(tǒng)一繪制。它可以用于分塊繪制,也可以用于減少重復(fù)繪制。
var renderTarget = new CanvasCommandList(sender);
using (var clds = renderTarget.CreateDrawingSession())
{
clds.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
clds.DrawText("Hello, world!", 100, 100, Colors.Yellow);
}
args.DrawingSession.DrawImage(renderTarget);濾鏡效果
Win2D的一個(gè)比較給力的特性就是支持濾鏡特效,用它可以非常方便的實(shí)現(xiàn)常用的模糊、陰影等效果,這里以高斯模糊為例修改下上面的效果。
var cmdList = new CanvasCommandList(sender);
using (var clds = cmdList.CreateDrawingSession())
{
clds.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
clds.DrawText("Hello, world!", 100, 100, Colors.Yellow);
}
var effect = new GaussianBlurEffect();
effect.Source = cmdList;
args.DrawingSession.DrawImage(effect);系統(tǒng)還內(nèi)置了許多常用的濾鏡效果,它們都以Effect結(jié)尾,放在Microsoft.Graphics.Canvas.Effects名字空間下。
繪制事件
除了前面用到的繪制的時(shí)候觸發(fā)繪制操作的Draw事件外,還有一個(gè)比較常用的事件CreateResource,它在最開(kāi)始加載控件的時(shí)候觸發(fā),往往用于初始化各種資源。
另外再來(lái)看看Draw事件的觸發(fā)條件,它基本上和WPF的OnRender差不多,也就是說(shuō),一般在初次加載時(shí)會(huì)觸發(fā),改變窗口大小的時(shí)候會(huì)觸發(fā),拖動(dòng)窗口時(shí)不會(huì)觸發(fā)。如果要在后臺(tái)控制其重繪也比較簡(jiǎn)單,但用其Invalidate方法即可。
到此這篇關(guān)于C#使用Win2D在UWP程序中實(shí)現(xiàn)2D繪圖的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#調(diào)用Windows的API實(shí)現(xiàn)窗體動(dòng)畫(huà)
在VF、VB、PB的應(yīng)用中,有些無(wú)法通過(guò)語(yǔ)言工具本身來(lái)完成的或者做得不理想的功能,我們會(huì)考慮通過(guò)Windows的API來(lái)完成。本文就來(lái)通過(guò)調(diào)用Windows的API實(shí)現(xiàn)窗體動(dòng)畫(huà),感興趣的可以嘗試一下2022-11-11
基于WPF實(shí)現(xiàn)3D畫(huà)廊動(dòng)畫(huà)效果的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何基于WPF實(shí)現(xiàn)簡(jiǎn)單的3D畫(huà)廊動(dòng)畫(huà)效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02
WPF實(shí)現(xiàn)動(dòng)畫(huà)效果(一)之基本概念
這篇文章介紹了WPF實(shí)現(xiàn)動(dòng)畫(huà)效果之基本概念,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
C#區(qū)分中英文按照指定長(zhǎng)度截取字符串的方法
這篇文章主要介紹了C#區(qū)分中英文按照指定長(zhǎng)度截取字符串的方法,涉及C#操作字符串的正則匹配與截取等常用操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03
C#請(qǐng)求http向網(wǎng)頁(yè)發(fā)送接收數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了C#請(qǐng)求http向網(wǎng)頁(yè)發(fā)送數(shù)據(jù)、網(wǎng)頁(yè)接收的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
C#在Windows上調(diào)用7-zip實(shí)現(xiàn)壓縮文件
這篇文章主要為大家詳細(xì)介紹了C#如何在Windows上調(diào)用7-zip實(shí)現(xiàn)壓縮文件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以學(xué)習(xí)一下2023-10-10
C#實(shí)現(xiàn)獲取計(jì)算機(jī)信息的示例代碼
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)獲取計(jì)算機(jī)軟硬件信息的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2024-01-01

