分享
 
 
 

WPF学习05:2D绘图使用Transform进行控件变形

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: |||超大  

在WPF学习04:2D绘图 使用Shape绘基本图形中,我们了解了如何绘制基本的图形。

这一次,我们进一步,研究如何将图形变形。

例子 一个三角形,经Transform形成组合图形:

XAML代码:

<Windowx:Class="Transforms.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/PResentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="MainWindow"Height="350"Width="525"Loaded="Window_Loaded"><CanvasName="MainCanvas"></Canvas></Window>

C#代码:

for(inti =0; i <36; i++)

{varpolygon =newPolygon()

{

Fill=newSolidColorBrush(Colors.LightBlue),

Points=newPointCollection() {newPoint() {X =0, Y =0},newPoint(){X =100, Y =5},newPoint(){X =0, Y =10}

}

};

polygon.RenderTransform=newTransformGroup()

{

Children=newTransformCollection()

{newRotateTransform(){ Angle = i *10}

}

};

Canvas.SetTop(polygon,100);

Canvas.SetLeft(polygon,200);

MainCanvas.Children.Add(polygon);

}

Shape简介 WPF提供了Transform类,使我们得以对控件进行变形操作。

Transform提供了TranslateTransform(平移变形) RotateTransform(旋转变形) ScaleTransform(缩放变形) SkewTransform(扭曲变形) MatrixTransform(矩阵变换变形)

回顾一下Shape的继承结构:

UIElement提供了RenderTransform

FrameworkElement提供了LayoutTransform

两者皆为Transform类型的属性,本文将逐个介绍各类变形的使用方法,最后将说明这两种Transform的区别。

TranslateTransform:

XAML实现:

<CanvasName="MainCanvas"><PolygonPoints="0,0 100,25 0,50"Stroke="Black"StrokeThickness="2"StrokeDashArray="1 1"></Polygon><TextBlockCanvas.Top="15"Canvas.Left="2">我是原图形</TextBlock><PolygonPoints="0,0 100,25 0,50"Fill="#019AFF"><Polygon.RenderTransform><TransformGroup><TranslateTransformX="50"Y="100"></TranslateTransform></TransformGroup></Polygon.RenderTransform></Polygon></Canvas>

后台代码实现:

varpolygon =newPolygon()

{

Fill=newSolidColorBrush(Color.FromRgb(0x01,0x9A,0xFF)),

Points=newPointCollection()

{newPoint() {X =0, Y =0},newPoint(){X =100, Y =25},newPoint(){X =0, Y =50}

},

RenderTransform=newTransformGroup()

{

Children=newTransformCollection()

{newTranslateTransform(){X=50,Y=100}

}

}

};

MainCanvas.Children.Add(polygon);

RotateTransform

XAML实现:

<CanvasName="MainCanvas"><PolygonPoints="0,0 100,25 0,50"Stroke="Black"StrokeThickness="2"StrokeDashArray="1 1"></Polygon><TextBlockCanvas.Top="15"Canvas.Left="2">我是原图形</TextBlock><PolygonPoints="0,0 100,25 0,50"Fill="#019AFF"><Polygon.RenderTransform><TransformGroup><TranslateTransformX="250"Y="100"></TranslateTransform></TransformGroup></Polygon.RenderTransform></Polygon><PolygonPoints="0,0 100,25 0,50"Fill="#019AFF"><Polygon.RenderTransform><TransformGroup><TranslateTransformX="50"Y="100"></TranslateTransform><RotateTransformCenterX="50"CenterY="100"Angle="50"></RotateTransform></TransformGroup></Polygon.RenderTransform></Polygon></Canvas>

后台代码实现:

varpolygon =newPolygon()

{

Fill=newSolidColorBrush(Color.FromRgb(0x01,0x9A,0xFF)),

Points=newPointCollection()

{newPoint() {X =0, Y =0},newPoint(){X =100, Y =25},newPoint(){X =0, Y =50}

},

RenderTransform=newTransformGroup()

{

Children=newTransformCollection()

{newTranslateTransform(){X=50,Y=100},newRotateTransform(){Angle=50, CenterX=50, CenterY=100}

}

}

};

注意,这里通过设置CenterX CenterY配置旋转的参考中心点,改点默认为(0, 0)

ScaleTransform

XAML实现:

<CanvasName="MainCanvas"><PolygonPoints="0,0 100,25 0,50"Stroke="Black"StrokeThickness="2"StrokeDashArray="1 1"></Polygon><TextBlockCanvas.Top="15"Canvas.Left="2">我是原图形</TextBlock><PolygonPoints="0,0 100,25 0,50"Fill="#019AFF"><Polygon.RenderTransform><TransformGroup><TranslateTransformX="50"Y="100"></TranslateTransform><ScaleTransformScaleX="0.5"ScaleY="0.5"></ScaleTransform></TransformGroup></Polygon.RenderTransform></Polygon><PolygonPoints="0,0 100,25 0,50"Fill="#019AFF"><Polygon.RenderTransform><TransformGroup><TranslateTransformX="50"Y="100"></TranslateTransform><ScaleTransformScaleX="1.5"ScaleY="1.5"></ScaleTransform></TransformGroup></Polygon.RenderTransform></Polygon></Canvas>

后台代码实现参考之前的代码,类似。

SkewTransform

XAML实现:

<CanvasName="MainCanvas"><PolygonPoints="0,0 100,25 0,50"Stroke="Black"StrokeThickness="2"StrokeDashArray="1 1"></Polygon><TextBlockCanvas.Top="15"Canvas.Left="2">我是原图形</TextBlock><PolygonPoints="0,0 100,25 0,50"Fill="#019AFF"><Polygon.RenderTransform><TransformGroup><SkewTransformAngleY="40"></SkewTransform></TransformGroup></Polygon.RenderTransform></Polygon></Canvas>

后台代码实现参考之前的代码,类似。

MatrixTransform

图形变换的本质都是将各个点,映射到一个齐次坐标系,然后乘上一个3X3的矩阵进行变换。

详细的内容这本书介绍的比较全:

这里只实现一个简单的矩阵实现平移:

实现代码:

varpolygon =newPolygon()

{

Fill=newSolidColorBrush(Color.FromRgb(0x01,0x9A,0xFF)),

Points=newPointCollection()

{newPoint(){X=0, Y =0},newPoint(){X=0, Y =50},newPoint(){X=100, Y =25}

},

RenderTransform=newTransformGroup()

{

Children=newTransformCollection()

{newMatrixTransform()

{

Matrix=newMatrix()

{

M11=1, M12 =0,

M21=0, M22 =1,

OffsetX=150, OffsetY =100}

}

}

}

};

MainCanvas.Children.Add(polygon);

RenderTransform与LayoutTransform 对于Canvas这样使用绝对定位的Layout控件下的变形操作,两者的效果是一致的。

而在其它的布局控件中,LayoutTransform是会影响到布局的。

例子:

XAML代码:

<StackPanelName="MainCanvas"><PolygonPoints="0,0 150,25 0,50"Stroke="Black"StrokeThickness="2"StrokeDashArray="1 1"><Polygon.LayoutTransform><RotateTransformAngle="50"></RotateTransform></Polygon.LayoutTransform></Polygon><PolygonPoints="0,0 150,25 0,50"Stroke="Black"StrokeThickness="2"StrokeDashArray="1 1"></Polygon></StackPanel>

我们将LayoutTransform改为RenderTransform,结果如下:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有