WPF学习05:2D绘图 使用Transform进行控件变形
在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进行控件变形的更多相关文章
- 【WPF学习】第二十五章 日期控件
WPF包含两个日期控件:Calender和DatePicker.这两个控件都被设计为允许用户选择日期. Calendar控件显示日期,在与Windows操作系统中看到的日历(例如,当配置系统日期时看到 ...
- 【WPF学习】第二十二章 文本控件
WPF提供了三个用于输入文本的控件:TextBox.RichTextBox和PasswordBox.PasswordBox控件直接继承自Control类.TextBox和RichTextBox控件间接 ...
- WPF学习之路(十二)控件(Items控件)
ListBox 提供了一个选项列表,可以固定或者动态绑定 <StackPanel> <GroupBox Margin="> <GroupBox.Header& ...
- WPF学习之路(十二)控件(Range控件)
ProgressBar 进度条,主要属性:Minimum\Maximun\Value, IsIndeterminate为True时,进度条会循环运转 <Grid> <Grid.Row ...
- WPF学习之路(十二)控件(HeaderedContent控件)
GroupBox 用来组织多种控件的常见控件,因为是内容空间,只能直接包含一项,需要使用面板一类的中间空间. Header和Content可以是任意元素 <GroupBox> <Gr ...
- WPF学习之路(十二)控件(Content控件)
Label Label相比TextBlock功能并不强大,但是支持键盘快捷键的方式获得焦点 <StackPanel> <Label Target="{Binding Ele ...
- UWP学习记录9-设计和UI之控件和模式6
UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...
- WPF教程十一:简单了解并使用控件模板
WPF教程十一:简单了解并使用控件模板 这一章梳理控件模板,每个WPF控件都设计成无外观的,但是行为设计上是不允许改变的,比如使用Button的控件时,按钮提供了能被点击的内容,那么自由的改变控件外观 ...
- UWP学习记录10-设计和UI之控件和模式7
UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...
随机推荐
- mysql简单介绍
SQL语言分为三个部分:数据定义语言( Data DefinitionLanguage,简称为DDL).数据操作语言( DataManipulation Language,简称为DML)和数据控制语言 ...
- POJ 3164 Command Network 最小树形图模板
最小树形图求的是有向图的最小生成树,跟无向图求最小生成树有很大的区别. 步骤大致如下: 1.求除了根节点以外每个节点的最小入边,记录前驱 2.判断除了根节点,是否每个节点都有入边,如果存在没有入边的点 ...
- jemter转换报告生成html格式报告
前言: 结合上篇,因为使用Jenkins做集成,jmeter的结果肯定需要生产一个报告,如果按原本的jmt格式生成,肯定是不行的,现在就需要对报告格式进行转换 使用工具: ant:jmeter可以通过 ...
- 数理方程:Fourier变换与卷积
更新:1 APR 2016 关于傅里叶级数参看数理方程:Fourier级数 Fourier变换: 对于满足Dirichlet条件的函数\(f(t)\)在其连续点处定义 \(F(\omega)=\int ...
- Table of Contents - Apache Commons
Apache Commons 简述 CLI Usage of CLI Option Properties Codec 常见的编码解码 Compress Configuration2 Quick sta ...
- Asp.net MVC 4 模型的数据注释
[Bind(…)] Lists fields to exclude or include when binding parameter or form values to model properti ...
- 【转载】分析商品日均销量(DMS)对促销商品选择的意义
江苏省常州市信特超市有限公司副总经理高晓颖 随着中国零售业的进一步的开放,竞争日趋激烈,促销活动在日常经营中已经成为不可缺少的一部分,频繁的促销活动的开展,零售业经营管理者越来越觉得促销商品的选择难度 ...
- 使用命令修改ip地址
简述:以serverv 2012 r2为例 常用的几种,当然不全,希望能较快的速率记下一种便可 直接配置 1. 查看网卡的显示名称 2. 配置静态iP地址 3. 查看配置 ...
- C语言知识总结(4)
变量的作用域 C语言根据变量作用域的不同,将变量分为局部变量和全局变量 1.局部变量 1> 定义:在函数内部定义的变量,称为局部变量.形式参数也属于局部变量. 2> 作用域:局部变量只在定 ...
- UI2_UISwitch与UIActivity
// // ViewController.m // UI2_UISwitch与UIActivity // // Created by zhangxueming on 15/7/7. // Copyri ...