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

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

例子

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

XAML代码:

<Window x: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">
<Canvas Name="MainCanvas">
</Canvas>
</Window>

C#代码:

for (int i = ; i < ; i++)
{
var polygon = new Polygon()
{
Fill = new SolidColorBrush(Colors.LightBlue),
Points = new PointCollection() {
new Point() {X = , Y = },
new Point(){X = , Y = },
new Point(){X = , Y = }
}
};
polygon.RenderTransform = new TransformGroup()
{
Children = new TransformCollection()
{
new RotateTransform(){ Angle = i * }
}
};
Canvas.SetTop(polygon, );
Canvas.SetLeft(polygon, );
MainCanvas.Children.Add(polygon);
}

Shape简介

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

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

回顾一下Shape的继承结构:

UIElement提供了RenderTransform

FrameworkElement提供了LayoutTransform

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


TranslateTransform:

XAML实现:

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

后台代码实现:

var polygon = new Polygon()
{
Fill = new SolidColorBrush(Color.FromRgb(0x01, 0x9A, 0xFF)),
Points = new PointCollection()
{
new Point() {X = , Y = },
new Point(){X = , Y = },
new Point(){X = , Y = }
},
RenderTransform = new TransformGroup()
{
Children = new TransformCollection()
{
new TranslateTransform(){X=,Y=}
}
}
};
MainCanvas.Children.Add(polygon);

RotateTransform

XAML实现:

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

后台代码实现:

var polygon = new Polygon()
{
Fill = new SolidColorBrush(Color.FromRgb(0x01, 0x9A, 0xFF)),
Points = new PointCollection()
{
new Point() {X = , Y = },
new Point(){X = , Y = },
new Point(){X = , Y = }
},
RenderTransform = new TransformGroup()
{
Children = new TransformCollection()
{
new TranslateTransform(){X=,Y=},
new RotateTransform(){Angle=, CenterX=, CenterY=}
}
}
};

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


ScaleTransform

XAML实现:

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

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


SkewTransform

XAML实现:

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

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


MatrixTransform

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

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

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

实现代码:

var polygon = new Polygon()
{
Fill = new SolidColorBrush(Color.FromRgb(0x01, 0x9A, 0xFF)),
Points = new PointCollection()
{
new Point(){X=, Y = },
new Point(){X=, Y = },
new Point(){X=, Y = }
},
RenderTransform = new TransformGroup()
{
Children = new TransformCollection()
{
new MatrixTransform()
{
Matrix = new Matrix()
{
M11 = , M12 = ,
M21 = , M22 = ,
OffsetX = , OffsetY =
}
}
}
}
};
MainCanvas.Children.Add(polygon);

RenderTransform与LayoutTransform

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

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

例子:

XAML代码:

<StackPanel Name="MainCanvas">
<Polygon Points="0,0 150,25 0,50" Stroke="Black" StrokeThickness="2" StrokeDashArray="1 1">
<Polygon.LayoutTransform>
<RotateTransform Angle="50"></RotateTransform>
</Polygon.LayoutTransform>
</Polygon>
<Polygon Points="0,0 150,25 0,50" Stroke="Black" StrokeThickness="2" StrokeDashArray="1 1"></Polygon>
</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学习笔记④——页面的布局方式

    FrameLayout(帧布局) 这个布局的特点是简单的默认把每一个视图组件都放在边框内且放在左上角,即使添加多个视图组件,他们也都是重叠在左上角,新的视图会遮挡住旧的视图.可以根据gravity来改 ...

  2. 使用Nginx SSI功能辅助HTML页面设计

    SSI,Server Side Include,支持html静态文件内以 <!--#include file="/layout/header.html"-->  的方式 ...

  3. JVM 运行时内存结构

      1.JVM内存模型       JVM运行时内存=共享内存区+线程内存区 1).共享内存区       共享内存区=持久带+堆       持久带=方法区+其他       堆=Old Space ...

  4. hdu 4705 排列组合

    思路:枚举能是A,B,C在一条简单路径上的中点. 计算多少个几何能满足.在用总数减去 #pragma comment(linker, "/STACK:16777216") #inc ...

  5. 实战FFmpeg编译支持arm64(转)

    App store要求上架的app必须支持arm64.而手中的ffmpeg还不支持arm64, 百度下ffmpeg支持arm64方法,网上有很多资料.其中一篇是使用脚本自动编译实现的.本文就是使用它的 ...

  6. autocomplete.js的使用(1):自动输入时,出现下拉选择框

    autocomplete.js可以实现自动输入文本值,并出现下拉框 js引用:所需要的autocomplete文件需要在网站中自行下载. <!--自动输入文本值所需的jquery文件--> ...

  7. Java之循环练习2

    吐槽O(∩_∩)O:由于前几天电脑坏了,除了在弄电脑的同时又在练习科目三了,又是晒了三天网鱼都没打了.计划还是赶不上变化,真的是让人乱了节拍啊.咔!吐槽完毕,让我们的循环练习继续. 练习一:一个人很倒 ...

  8. sql server 锁学习

    insert 默认加的锁是 不允许select,update  但是可以insert update 默认加的锁是 不允许 update 可以 select ,insert

  9. 简单的表单验证插件(Jquery)

    在做web开发的时候经常遇到表单验证问题,表单验证一般有客户端验证和服务器端验证,这个验证插件仅仅能满足我的项目中的基本需求的. Validate_Tools.js function Validate ...

  10. 北大ACM(POJ1009-Edge Detection)

    Question:http://poj.org/problem?id=1009问题点:RLE编码. Memory: 648K Time: 547MS Language: C++ Result: Acc ...