WPF学习05:2D绘图 使用Transform进行控件变形
2015-04-01 20:04
686 查看
在WPF学习04:2D绘图使用Shape绘基本图形中,我们了解了如何绘制基本的图形。
这一次,我们进一步,研究如何将图形变形。
XAML代码:
C#代码:
Transform提供了TranslateTransform(平移变形)RotateTransform(旋转变形)ScaleTransform(缩放变形)SkewTransform(扭曲变形)MatrixTransform(矩阵变换变形)
回顾一下Shape的继承结构:
UIElement提供了RenderTransform
FrameworkElement提供了LayoutTransform
两者皆为Transform类型的属性,本文将逐个介绍各类变形的使用方法,最后将说明这两种Transform的区别。
XAML实现:
后台代码实现:
XAML实现:
后台代码实现:
注意,这里通过设置CenterXCenterY配置旋转的参考中心点,改点默认为(0,0)
XAML实现:
后台代码实现参考之前的代码,类似。
XAML实现:
后台代码实现参考之前的代码,类似。
详细的内容这本书介绍的比较全:
这里只实现一个简单的矩阵实现平移:
实现代码:
而在其它的布局控件中,LayoutTransform是会影响到布局的。
例子:
XAML代码:
我们将LayoutTransform改为RenderTransform,结果如下:
这一次,我们进一步,研究如何将图形变形。
例子
一个三角形,经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,0100,250,50"Stroke="Black"StrokeThickness="2"StrokeDashArray="11"></Polygon> <TextBlockCanvas.Top="15"Canvas.Left="2">我是原图形</TextBlock> <PolygonPoints="0,0100,250,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,0100,250,50"Stroke="Black"StrokeThickness="2"StrokeDashArray="11"></Polygon>
<TextBlockCanvas.Top="15"Canvas.Left="2">我是原图形</TextBlock>
<PolygonPoints="0,0100,250,50"Fill="#019AFF">
<Polygon.RenderTransform>
<TransformGroup>
<TranslateTransformX="250"Y="100"></TranslateTransform>
</TransformGroup>
</Polygon.RenderTransform>
</Polygon>
<PolygonPoints="0,0100,250,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}
}
}
};
注意,这里通过设置CenterXCenterY配置旋转的参考中心点,改点默认为(0,0)
ScaleTransform
XAML实现:
<CanvasName="MainCanvas">
<PolygonPoints="0,0100,250,50"Stroke="Black"StrokeThickness="2"StrokeDashArray="11"></Polygon>
<TextBlockCanvas.Top="15"Canvas.Left="2">我是原图形</TextBlock>
<PolygonPoints="0,0100,250,50"Fill="#019AFF">
<Polygon.RenderTransform>
<TransformGroup>
<TranslateTransformX="50"Y="100"></TranslateTransform>
<ScaleTransformScaleX="0.5"ScaleY="0.5"></ScaleTransform>
</TransformGroup>
</Polygon.RenderTransform>
</Polygon>
<PolygonPoints="0,0100,250,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,0100,250,50"Stroke="Black"StrokeThickness="2"StrokeDashArray="11"></Polygon>
<TextBlockCanvas.Top="15"Canvas.Left="2">我是原图形</TextBlock>
<PolygonPoints="0,0100,250,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,0150,250,50"Stroke="Black"StrokeThickness="2"StrokeDashArray="11">
<Polygon.LayoutTransform>
<RotateTransformAngle="50"></RotateTransform>
</Polygon.LayoutTransform>
</Polygon>
<PolygonPoints="0,0150,250,50"Stroke="Black"StrokeThickness="2"StrokeDashArray="11"></Polygon>
</StackPanel>
我们将LayoutTransform改为RenderTransform,结果如下:
相关文章推荐
- 使用Eclipse RCP进行桌面程序开发(五):2D绘图
- 使用Eclipse RCP进行桌面程序开发(五):2D绘图
- NodeJs学习笔记 05 -- 使用node进行web开发(未完)
- 如何使用WPF图表控件Chart FX进行数据转换
- (原创)c#学习笔记05--变量的更多内容01--类型转换03--使用Convert命令进行显式转焕
- WPF学习之控件使用
- C#学习笔记-WPF前端布局和控件的使用
- WPF学习笔记--使用配置文件修改控件、面板颜色
- 【IOS 开发学习总结-OC-65】Quartz 2D绘图(4-2)——绘制文本+设置阴影+使用路径
- iOS开发中使用Quartz2D绘图及自定义UIImageView控件
- 说说如何使用 canvas 进行 2D 绘图
- [Swift]使用Quartz 2D进行绘图
- 使用Eclipse RCP进行桌面程序开发(五):2D绘图
- 使用Eclipse RCP进行桌面程序开发(五):2D绘图
- ACCP学习旅程之-----使用C#开发数据库应用程序(第五章 用控件进行快速开发)
- WPF下的地图开发控件(GMap.NET)使用心得—— GMap学习笔记(二)
- 数据挖掘学习05 - 使用R对文本进行hierarchical cluster并验证结果
- C#.NET常见问题(FAQ)-如何使用2D绘图控件ZedGraph绘制坐标轴和坐标曲线
- Delphi开发学习二:使用ADOQuery控件对SQL数据库表进行操作
- C#.NET常见问题(FAQ)-如何使用2D绘图控件ZedGraph绘制坐标轴和坐标曲线