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

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

例子

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

XAML代码:

  1. <Window x:Class="Transforms.MainWindow"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
  5. <Canvas Name="MainCanvas">
  6. </Canvas>
  7. </Window>

C#代码:

  1. for (int i = ; i < ; i++)
  2. {
  3. var polygon = new Polygon()
  4. {
  5. Fill = new SolidColorBrush(Colors.LightBlue),
  6. Points = new PointCollection() {
  7. new Point() {X = , Y = },
  8. new Point(){X = , Y = },
  9. new Point(){X = , Y = }
  10. }
  11. };
  12. polygon.RenderTransform = new TransformGroup()
  13. {
  14. Children = new TransformCollection()
  15. {
  16. new RotateTransform(){ Angle = i * }
  17. }
  18. };
  19. Canvas.SetTop(polygon, );
  20. Canvas.SetLeft(polygon, );
  21. MainCanvas.Children.Add(polygon);
  22. }

Shape简介

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

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

回顾一下Shape的继承结构:

UIElement提供了RenderTransform

FrameworkElement提供了LayoutTransform

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


TranslateTransform:

XAML实现:

  1. <Canvas Name="MainCanvas">
  2. <Polygon Points="0,0 100,25 0,50" Stroke="Black" StrokeThickness="2" StrokeDashArray="1 1"></Polygon>
  3. <TextBlock Canvas.Top="15" Canvas.Left="2">我是原图形</TextBlock>
  4. <Polygon Points="0,0 100,25 0,50" Fill="#019AFF">
  5. <Polygon.RenderTransform>
  6. <TransformGroup>
  7. <TranslateTransform X="50" Y="100"></TranslateTransform>
  8. </TransformGroup>
  9. </Polygon.RenderTransform>
  10. </Polygon>
  11. </Canvas>
  1.  

后台代码实现:

  1. var polygon = new Polygon()
  2. {
  3. Fill = new SolidColorBrush(Color.FromRgb(0x01, 0x9A, 0xFF)),
  4. Points = new PointCollection()
  5. {
  6. new Point() {X = , Y = },
  7. new Point(){X = , Y = },
  8. new Point(){X = , Y = }
  9. },
  10. RenderTransform = new TransformGroup()
  11. {
  12. Children = new TransformCollection()
  13. {
  14. new TranslateTransform(){X=,Y=}
  15. }
  16. }
  17. };
  18. MainCanvas.Children.Add(polygon);

RotateTransform

XAML实现:

  1. <Canvas Name="MainCanvas">
  2. <Polygon Points="0,0 100,25 0,50" Stroke="Black" StrokeThickness="2" StrokeDashArray="1 1"></Polygon>
  3. <TextBlock Canvas.Top="15" Canvas.Left="2">我是原图形</TextBlock>
  4. <Polygon Points="0,0 100,25 0,50" Fill="#019AFF">
  5. <Polygon.RenderTransform>
  6. <TransformGroup>
  7. <TranslateTransform X="250" Y="100"></TranslateTransform>
  8. </TransformGroup>
  9. </Polygon.RenderTransform>
  10. </Polygon>
  11. <Polygon Points="0,0 100,25 0,50" Fill="#019AFF">
  12. <Polygon.RenderTransform>
  13. <TransformGroup>
  14. <TranslateTransform X="50" Y="100"></TranslateTransform>
  15. <RotateTransform CenterX="50" CenterY="100" Angle="50"></RotateTransform>
  16. </TransformGroup>
  17. </Polygon.RenderTransform>
  18. </Polygon>
  19. </Canvas>

后台代码实现:

  1. var polygon = new Polygon()
  2. {
  3. Fill = new SolidColorBrush(Color.FromRgb(0x01, 0x9A, 0xFF)),
  4. Points = new PointCollection()
  5. {
  6. new Point() {X = , Y = },
  7. new Point(){X = , Y = },
  8. new Point(){X = , Y = }
  9. },
  10. RenderTransform = new TransformGroup()
  11. {
  12. Children = new TransformCollection()
  13. {
  14. new TranslateTransform(){X=,Y=},
  15. new RotateTransform(){Angle=, CenterX=, CenterY=}
  16. }
  17. }
  18. };

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


ScaleTransform

XAML实现:

  1. <Canvas Name="MainCanvas">
  2. <Polygon Points="0,0 100,25 0,50" Stroke="Black" StrokeThickness="2" StrokeDashArray="1 1"></Polygon>
  3. <TextBlock Canvas.Top="15" Canvas.Left="2">我是原图形</TextBlock>
  4. <Polygon Points="0,0 100,25 0,50" Fill="#019AFF">
  5. <Polygon.RenderTransform>
  6. <TransformGroup>
  7. <TranslateTransform X="50" Y="100"></TranslateTransform>
  8. <ScaleTransform ScaleX="0.5" ScaleY="0.5"></ScaleTransform>
  9. </TransformGroup>
  10. </Polygon.RenderTransform>
  11. </Polygon>
  12. <Polygon Points="0,0 100,25 0,50" Fill="#019AFF">
  13. <Polygon.RenderTransform>
  14. <TransformGroup>
  15. <TranslateTransform X="50" Y="100"></TranslateTransform>
  16. <ScaleTransform ScaleX="1.5" ScaleY="1.5"></ScaleTransform>
  17. </TransformGroup>
  18. </Polygon.RenderTransform>
  19. </Polygon>
  20. </Canvas>

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


SkewTransform

XAML实现:

  1. <Canvas Name="MainCanvas">
  2. <Polygon Points="0,0 100,25 0,50" Stroke="Black" StrokeThickness="2" StrokeDashArray="1 1"></Polygon>
  3. <TextBlock Canvas.Top="15" Canvas.Left="2">我是原图形</TextBlock>
  4. <Polygon Points="0,0 100,25 0,50" Fill="#019AFF">
  5. <Polygon.RenderTransform>
  6. <TransformGroup>
  7. <SkewTransform AngleY="40" ></SkewTransform>
  8. </TransformGroup>
  9. </Polygon.RenderTransform>
  10. </Polygon>
  11. </Canvas>

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


MatrixTransform

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

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

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

实现代码:

  1. var polygon = new Polygon()
  2. {
  3. Fill = new SolidColorBrush(Color.FromRgb(0x01, 0x9A, 0xFF)),
  4. Points = new PointCollection()
  5. {
  6. new Point(){X=, Y = },
  7. new Point(){X=, Y = },
  8. new Point(){X=, Y = }
  9. },
  10. RenderTransform = new TransformGroup()
  11. {
  12. Children = new TransformCollection()
  13. {
  14. new MatrixTransform()
  15. {
  16. Matrix = new Matrix()
  17. {
  18. M11 = , M12 = ,
  19. M21 = , M22 = ,
  20. OffsetX = , OffsetY =
  21. }
  22. }
  23. }
  24. }
  25. };
  26. MainCanvas.Children.Add(polygon);

RenderTransform与LayoutTransform

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

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

例子:

XAML代码:

  1. <StackPanel Name="MainCanvas">
  2. <Polygon Points="0,0 150,25 0,50" Stroke="Black" StrokeThickness="2" StrokeDashArray="1 1">
  3. <Polygon.LayoutTransform>
  4. <RotateTransform Angle="50"></RotateTransform>
  5. </Polygon.LayoutTransform>
  6. </Polygon>
  7. <Polygon Points="0,0 150,25 0,50" Stroke="Black" StrokeThickness="2" StrokeDashArray="1 1"></Polygon>
  8. </StackPanel>

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

WPF学习05:2D绘图 使用Transform进行控件变形的更多相关文章

  1. 【WPF学习】第二十五章 日期控件

    WPF包含两个日期控件:Calender和DatePicker.这两个控件都被设计为允许用户选择日期. Calendar控件显示日期,在与Windows操作系统中看到的日历(例如,当配置系统日期时看到 ...

  2. 【WPF学习】第二十二章 文本控件

    WPF提供了三个用于输入文本的控件:TextBox.RichTextBox和PasswordBox.PasswordBox控件直接继承自Control类.TextBox和RichTextBox控件间接 ...

  3. WPF学习之路(十二)控件(Items控件)

     ListBox 提供了一个选项列表,可以固定或者动态绑定 <StackPanel> <GroupBox Margin="> <GroupBox.Header& ...

  4. WPF学习之路(十二)控件(Range控件)

    ProgressBar 进度条,主要属性:Minimum\Maximun\Value, IsIndeterminate为True时,进度条会循环运转 <Grid> <Grid.Row ...

  5. WPF学习之路(十二)控件(HeaderedContent控件)

    GroupBox 用来组织多种控件的常见控件,因为是内容空间,只能直接包含一项,需要使用面板一类的中间空间. Header和Content可以是任意元素 <GroupBox> <Gr ...

  6. WPF学习之路(十二)控件(Content控件)

    Label Label相比TextBlock功能并不强大,但是支持键盘快捷键的方式获得焦点 <StackPanel> <Label Target="{Binding Ele ...

  7. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

  8. WPF教程十一:简单了解并使用控件模板

    WPF教程十一:简单了解并使用控件模板 这一章梳理控件模板,每个WPF控件都设计成无外观的,但是行为设计上是不允许改变的,比如使用Button的控件时,按钮提供了能被点击的内容,那么自由的改变控件外观 ...

  9. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

随机推荐

  1. Android之旅:梦想、学习、坚持、自信、淡定

    前段时间参加了2012年度IT博客大赛,进了前十强,写了一篇获奖感言,不过还没正式在CSDN发表出来.眼看2012年就要结束了,刚好借这个机会将2012年度IT博客大十强获奖感言发表出来,也算是对20 ...

  2. Android Chronometer的正常暂停和继续

    最近做了个小实验--一个小的计数秒表,实现开始计时,暂停计时,重置的功能.界面如下

  3. [UML]UML之开篇

    前言 大学时,学习软件工程时,学到了UML,由于当时接触项目太少,认识不清,再加上毕业后一直忙于coding,很少有时间去真正的认识和学习UML. 现在感觉有必要去回头看看这些东西啦. 什么是UML ...

  4. PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法

    这篇文章主要介绍了PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法,是在进行PHP数据库程序开发中常会遇 ...

  5. 20145102 Java 实验一

    20145102 Java 实验一 Java环境的安装 就像第一周写的一样,在linux下java的安装和配置简直简单的不行不行的,一个命令足以: sudo pacman -S jdk 配置什么的也就 ...

  6. 查看Eclipse32位还是64位以及Eclipse的编译版本号,查看JDK是32位还是64位

    一.查看Eclipse是32位还是64位 首先进入到Eclipse的安装目录: 查找到文件名为"eclipse.ini" 文件,使用文本编辑工具,或记事本打开,如下图: 以上是查看 ...

  7. hdu 4403 简单搜索

    思路:分等号左边和右边进行搜索 #include<iostream> #include<cstdio> #include<cstring> #include< ...

  8. poj 3979 分数加减法

    分数加减法 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13666   Accepted: 4594 Descriptio ...

  9. 碎片化时代:O2O服务成最大趋势

    从86年第一封电子E-Mail发出至今28个年头,中国互联网从单一点对点,点对多,多对多,如今又回归到点对点,从最基础的Mail.黄页应用到基于互动的Search.Blog以及基于满足人类基本需求的沟 ...

  10. Part 53 to 55 Talking about Reflection in C#

    Part 53 Reflection in C# Part 54 Reflection Example here is the code private void btnDiscover_Click( ...