WPF学习05:2D绘图之Transform

通过上一篇WPF学习WPF学习04:2D绘图之Shape我们可以进行基本图形的绘制。

涉及到图形应用编程,仅仅绘制基本的图形当然是不够的,我们可以借助WPF提供的Transform类,对控件进行变形操作。

例子

由一个三角形旋转而成的组合图形:

后台代码:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    for (int i = 0; i < 36; i++)
    {
        var polygon = new Polygon()
        {
            Fill = new SolidColorBrush(Colors.LightBlue),
            Points = new PointCollection() {
                new Point() {X = 0, Y = 0},
                new Point(){X = 100, Y = 5},
                new Point(){X = 0, Y = 10}
            }
        };
        polygon.RenderTransform = new TransformGroup()
        {
            Children = new TransformCollection()
            {
                new RotateTransform(){ Angle = i * 10 }
            }
        };

        Canvas.SetTop(polygon, 100);
        Canvas.SetLeft(polygon, 200);
        MainCanvas.Children.Add(polygon);
    }
}

Transform简介

回顾一下Shape的继承树:

所有的WPF控件基本都继承于UIElement与FrameworkElement 。

UIElement提供了布局后渲染的Transform属性:

FrameworkElement提供了布局前渲染的Transform属性:

public Transform LayoutTransform { get; set; }
public Transform RenderTransform { get; set; }
  通过配置控件的这两个属性,我们就可以对控件进行各类变形。
  我们先了解各类变形的使用方法,最后在回来说明两个属性的区别。

WPF提供了5种变形方法:TranslateTransform(位移变形) RotateTransform(旋转变形) ScaleTransform(缩放变形) SkewTransform(扭曲变形) MatrixTransform(矩阵变换变形)。


TranslateTransform

XAML实现:

<Canvas Name="MainCanvas">
    <Rectangle Width="150" Height="50" Stroke="Black" StrokeThickness="2" StrokeDashArray="1 1"/>
    <TextBlock Canvas.Left="39" Canvas.Top="16">我是原图形</TextBlock>
    <Rectangle Width="150" Height="50" Fill="#019AFF">
        <Rectangle.RenderTransform>
            <TranslateTransform X="50" Y="150"></TranslateTransform>
        </Rectangle.RenderTransform>
    </Rectangle>
    <Rectangle Width="150" Height="50" Fill="#019AFF">
        <Rectangle.RenderTransform>
            <TranslateTransform X="150" Y="60"></TranslateTransform>
        </Rectangle.RenderTransform>
    </Rectangle>
</Canvas>

后台代码实现:

var rect = new Rectangle()
{
    Fill = new SolidColorBrush(Color.FromRgb(0x01,0x9A,0xFF)),
    Width = 150,
    Height = 50,
    RenderTransform = new TransformGroup()
    {
        Children = new TransformCollection()
        {
            new TranslateTransform(){X=50,Y=150}
        }
    }
};
MainCanvas.Children.Add(rect);

RotateTransform

XAML实现:

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

后台代码实现:

var polygon = new Polygon()
{
    Fill = new SolidColorBrush(Color.FromRgb(0x01, 0x9A, 0xFF)),
    Points = new PointCollection()
    {
        new Point(){X=0, Y = 0},
        new Point(){X=0, Y = 50},
        new Point(){X=150, Y = 25}
    },
    RenderTransform = new TransformGroup()
    {
        Children = new TransformCollection()
        {
            new TranslateTransform(){X=50,Y=150},
            new RotateTransform()
            {
                CenterX = 125,
                CenterY = 175,
                Angle = 90
            }
        }
    }
};
MainCanvas.Children.Add(polygon);
    注意:这里的CenterX 与 CenterY指定了旋转中心点,默认位于(0,0)
 

ScaleTransform

XAML实现:

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

后台代码略,参考之前的后台代码实现即可。


SkewTransform

XAML实现:

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

后台代码略,参考之前的后台代码实现即可。


MatrixTransform

这本书对Matrix变形给了详细的说明:

说起来比较多,就不再本文说明了,直接给个例子:

实现平移,后台代码:

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

LayoutTransform与RenderTransform

对于Canvas这样使用绝对定位的布局空间,两者在使用上是没区别的。

而其它的WPF提供Layout组织的控件,LayoutTransform将会影响控件布局。

例子:

XAML代码:

<StackPanel>
    <Rectangle Fill="#019AFF" Width="150" Height="50">
            <Rectangle.RenderTransform>
                <RotateTransform Angle="50"></RotateTransform>
            </Rectangle.RenderTransform>
    </Rectangle>
        <Rectangle Fill="#019AFF" Width="150" Height="50"/>
    </StackPanel>
</Window>

修改RenderTransform为LayoutTransform:

时间: 2024-11-03 03:42:04

WPF学习05:2D绘图之Transform的相关文章

使用Win2D在UWP程序中2D绘图(二)

绘制API 首先还是看一下前文的的示例: args.DrawingSession.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);    args.DrawingSession.DrawText("Hello, world!", 100, 100, Colors.Yellow); 它使用了DrawingSesion下发绘制命令,和WPF中的DrawingContext差不多,就是一个绘制上下文.它主要的命令分为如下两种:DrawXXX和Fi

WPF学习开发客户端软件-任务助手(下)

时光如梭,距离第一次写的 WPF学习开发客户端软件-任务助手(已上传源码)  已有三个多月,期间我断断续续地对该项目做了优化.完善等等工作,现在重新向大家介绍一下,希望各位可以使用,本软件以实用性为主,采用MVVM模式(有小部分没有修改过来),小巧.使用方便. 具体功能与更新如下: 计划助手:本软件由[email protected]开发与维护,免费使用,如有好的意见或建议,可发送邮件到[email protected],谢谢使用!注(功能与特色):1.本软件使用方便.操作简便:2.本软件可设置

Quartz 2D 绘图,图像变换

IOS的quartz 2d 绘图,绘图有时候需要进行图形变换. 切记:Quartz 2D的变换都是以CG 开头的,不要和Core Animation的搞混了,Core animatin的是CA开头的. IOS提供了一组可以进行图像变换的API接口,一般的图像变换分为,平移.缩放.旋转. 平移 void CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty); 缩放 void CGContextScaleCTM(CGContext

GDI、DirectX、WPF、Winform等绘图相关关系梳理

绘图引擎方面,Windows下常用的为GDI.GDI+.DirectX.OpenGL等引擎,而Winform.MFC.WPF.Qt等则是用来实现对这些引擎调用的工具,属于更上层的范围,这几个绘图引擎中,前三者都是微软自己的东西,因此如果用C#来写的话用这几个引擎相对就会方便些. WPF采用的是DirectX作为底层绘图引擎,Winform和MFC则都采用GDI+,因此,Winform和MFC基本的绘图效率应该是接近的. DirectX是可以实现硬件加速的,如果PC上有GPU的话,那么WPF的图形

使用Win2D在UWP程序中2D绘图(一)

在新的Windows UWP程序中,引入了一个新的API库: Win2D.它是一个d2d的封装,可以直接使用C#来快速实现高效2D绘图了.这个API虽然在Win8.1时代就开始着手开发了,但最近才完善了下来.本文这里就简单的介绍一下它的基本用法: 安装 Win2D并不是Win10 SDK里面的一部分,需要从Nuget上安装,在程序包管理器里直接安装Win2D.uwp即可. PM> Install-Package Win2D.uwp 这个是Win10下的库,Win8下需要使用Win2D.win81

Quartz-2D绘图之概览

最近公司新项目需求要把数据图形化,趁着这个机会,重温了下Quarts-2D这个强大的跨平台2D绘图引擎. 一.Quartz概述 1.Quartz 2D是一个二维的绘图引擎,支持iOS和Mac OS平台. 2.功能:可以用来进行基本路径的绘制.透明度.描影.绘制阴影.透明层.颜色管理.反锯齿.PDF文档生成和PDF元数据访问等 二.Quartz操作 1.绘图顺序:Quartz既然是一个绘图引擎,那么画画的先后顺序是非常重要的,下图便展示了它的操作顺序,相信大家都很熟悉这幅图 2.绘制目标:Grap

WPF学习11:基于MVVM Light 制作图形编辑工具(2)

本文是WPF学习10:基于MVVM Light 制作图形编辑工具(1)的后续 这一次的目标是完成 两个任务. 画布 效果: 画布上,选择的方案是:直接以Image作为画布,使用RenderTargetBitmap绑定为Image的图片源,这样可以为后续的导出图片功能提供很大的便利. 对拖动栏XAML进行如下修改: <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="

WPF学习:3.Border &amp; Brush

上一章<WPF学习:2.Layout-Panels-Countainers>主要介绍了布局,容器和面板.这一章主要开始介绍Border(边界)和Brush(画刷). 代码地址:http://www.cnblogs.com/keylei203/archive/2013/03/12/keylei203.html 引言 在任何WPF的程序设计中,Border都占主要部分,一般都会使用很多Border装饰用户界面.从直接在window上放置borders到在ListBoxItem上放置Borders,

【WPF学习】第二十章 内容控件

原文:[WPF学习]第二十章 内容控件 内容控件(content control)是更特殊的控件类型,它们可包含并显示一块内容.从技术角度看,内容控件时可以包含单个嵌套元素的控件.与布局容器不同的是,内容控件只能包含一个子元素,而布局容器主要愿意可以包含任意多个牵头元素. 正如前面所介绍,所有WPF布局容器都继承自抽象类Panel,该类提供了对包含多个元素的支持.类似地,所有内容控件都继承自抽象类ContentControl.下图显示了ContentControl类的层次结构. 图 Conten