原文:重新想象 Windows 8 Store Apps (14) - 控件 UI: RenderTransform, Projection, Clip, UseLayoutRounding

[源码下载]

重新想象 Windows 8 Store Apps (14) - 控件 UI: RenderTransform, Projection, Clip, UseLayoutRounding

作者:webabcd

介绍
重新想象 Windows 8 Store Apps 之 控件 UI

  • RenderTransform - 变换(用于做位移,旋转,缩放,扭曲等变换)
  • Projection - 映射
  • Clip - 剪裁并显示 UIElement 的指定区域
  • UseLayoutRounding - 是否使用完整像素布局

示例
1、演示 RenderTransform 的应用
Controls/UI/RenderTransform.xaml

<Page
x:Class="XamlDemo.Controls.UI.RenderTransform"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Controls.UI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<Grid Margin="120 0 0 0"> <!--
RenderTransform - 变换(用于做位移,旋转,缩放,扭曲等变换)
--> <Grid HorizontalAlignment="Left" VerticalAlignment="Top">
<Rectangle Width="200" Height="100" StrokeDashArray="3,1" Stroke="Blue" StrokeThickness="3" />
<Rectangle Width="200" Height="100" Fill="Yellow" Stroke="Red" StrokeThickness="3" Opacity="0.3">
<Rectangle.RenderTransform> <!--RotateTransform - 旋转变换(顺时针)-->
<!--
Angle - 旋转角度。默认值 0
CenterX - 旋转中心点的 X 轴坐标。默认值 0
CenterY - 旋转中心点的 Y 轴坐标。默认值 0
-->
<RotateTransform Angle="15" CenterX="100" CenterY="50" /> </Rectangle.RenderTransform>
</Rectangle>
</Grid> <Grid Margin="400 0 0 0" HorizontalAlignment="Left" VerticalAlignment="Top">
<Rectangle Width="200" Height="100" StrokeDashArray="3,1" Stroke="Blue" StrokeThickness="3" />
<!--
RenderTransformOrigin - 位置变换的中心点
-->
<Rectangle Width="200" Height="100" Fill="Yellow" Stroke="Red" StrokeThickness="3" Opacity="0.3" RenderTransformOrigin="0.5,0.5">
<Rectangle.RenderTransform>
<RotateTransform Angle="15" />
</Rectangle.RenderTransform>
</Rectangle>
</Grid> <Grid Margin="800 0 0 0" HorizontalAlignment="Left" VerticalAlignment="Top">
<Rectangle Width="200" Height="100" StrokeDashArray="3,1" Stroke="Blue" StrokeThickness="3" />
<Rectangle Width="200" Height="100" Fill="Yellow" Stroke="Red" StrokeThickness="3" Opacity="0.3">
<Rectangle.RenderTransform> <!--TranslateTransform - 平移变换-->
<!--
X - 水平方向上移动的距离。默认值 0
Y - 垂直方向上移动的距离。默认值 0
-->
<TranslateTransform X="100" Y="10" /> </Rectangle.RenderTransform>
</Rectangle>
</Grid> <Grid Margin="0 200 0 0" HorizontalAlignment="Left" VerticalAlignment="Top">
<Rectangle Width="200" Height="100" StrokeDashArray="3,1" Stroke="Blue" StrokeThickness="3" />
<Rectangle Width="200" Height="100" Fill="Yellow" Stroke="Red" StrokeThickness="3" Opacity="0.3">
<Rectangle.RenderTransform> <!--ScaleTransform - 缩放变换-->
<!--
ScaleX - X 轴方向上缩放的倍数。默认值 1
ScaleY - Y 轴方向上缩放的倍数。默认值 1
CenterX - 缩放中心点的 X 轴坐标。默认值 0
CenterY - 缩放中心点的 Y 轴坐标。默认值 0
-->
<ScaleTransform ScaleX="1.1" ScaleY="1.3" CenterX="100" CenterY="50" /> </Rectangle.RenderTransform>
</Rectangle>
</Grid> <Grid Margin="400 200 0 0" HorizontalAlignment="Left" VerticalAlignment="Top">
<Rectangle Width="200" Height="100" StrokeDashArray="3,1" Stroke="Blue" StrokeThickness="3" />
<Rectangle Width="200" Height="100" Fill="Yellow" Stroke="Red" StrokeThickness="3" Opacity="0.3">
<Rectangle.RenderTransform> <!--SkewTransform - 扭曲变换(典型应用:在 二维 对象中模拟 三维 深度)-->
<!--
CenterX - 扭曲中心点的 X 轴坐标。默认值 0
CenterY - 扭曲中心点的 Y 轴坐标。默认值 0
AngleX - X 轴扭曲角度,Y 轴绕原点旋转(逆时针)。CenterX 对此值所产生的呈现结果没有影响。默认值 0
AngleY - Y 轴扭曲角度,X 轴绕原点旋转(顺时针)。CenterY 对此值所产生的呈现结果没有影响。默认值 0
-->
<SkewTransform AngleX="30" AngleY="5" CenterX="0" CenterY="0" /> </Rectangle.RenderTransform>
</Rectangle>
</Grid> <Grid Margin="800 200 0 0" HorizontalAlignment="Left" VerticalAlignment="Top">
<Rectangle Width="200" Height="100" StrokeDashArray="3,1" Stroke="Blue" StrokeThickness="3" />
<Rectangle Width="200" Height="100" Fill="Yellow" Stroke="Red" StrokeThickness="3" Opacity="0.3">
<Rectangle.RenderTransform> <!--TransformGroup - 多个 Transform 组成的复合变换-->
<TransformGroup>
<TranslateTransform X="100" Y="10" />
<RotateTransform Angle="15" CenterX="100" CenterY="50" />
</TransformGroup> </Rectangle.RenderTransform>
</Rectangle>
</Grid> <!--
CompositeTransform - 将多种变换方式合而为一
CenterX - 变换中心点的 X 坐标
CenterY - 变换中心点的 Y 坐标
Rotation - 顺时针旋转角度
ScaleX - 沿 X 轴方向上的缩放比例
ScaleY - 沿 Y 轴方向上的缩放比例
SkewX - X 轴扭曲角度
SkewY - Y 轴扭曲角度
TranslateX - 沿 X 轴方向上的平移距离
TranslateY - 沿 Y 轴方向上的平移距离
-->
<Grid Margin="0 400 0 0" HorizontalAlignment="Left" VerticalAlignment="Top">
<Rectangle Width="200" Height="100" StrokeDashArray="3,1" Stroke="Blue" StrokeThickness="3" />
<Rectangle Width="200" Height="100" Fill="Yellow" Stroke="Red" StrokeThickness="3" Opacity="0.3">
<Rectangle.RenderTransform>
<CompositeTransform SkewX="30" Rotation="60" ScaleX="0.6" ScaleY="0.3" />
</Rectangle.RenderTransform>
</Rectangle>
</Grid> <!--
MatrixTransform - 仿射矩阵变换 |X| |M11(默认值 1) M21(默认值 0) 0|
|Y| = |x y 1| * |M12(默认值 0) M22(默认值 1) 0|
|1| |OffsetX(默认值 0) OffsetY(默认值 0) 1| X = x * M11 + y * M12 + OffsetX
Y = x * M21 + y * M22 + OffsetY 利用 MatrixTransform 实现平移、旋转、缩放、扭曲的 Demo 详见 http://www.cnblogs.com/webabcd/archive/2008/11/03/1325150.html
-->
<Grid Margin="400 400 0 0" HorizontalAlignment="Left" VerticalAlignment="Top">
<Rectangle Width="200" Height="100" StrokeDashArray="3,1" Stroke="Blue" StrokeThickness="3" />
<Rectangle Width="200" Height="100" Fill="Yellow" Stroke="Red" StrokeThickness="3" Opacity="0.3">
<Rectangle.RenderTransform>
<!--
m11, m12, m21, m22, offsetX, offsetY
-->
<MatrixTransform Matrix="1, 0.5, 0, 1, 30, 10" />
</Rectangle.RenderTransform>
</Rectangle>
</Grid> </Grid>
</Grid>
</Page>

2、演示 Projection 的应用
Controls/UI/Projection.xaml

<Page
x:Class="XamlDemo.Controls.UI.Projection"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Controls.UI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<Grid Margin="120 0 0 0"> <!--
Projection - 映射 PlaneProjection - 平面映射,使 UIElement 实现 3D 效果
RotationX, RotationY, RotationZ - 绕 X轴, Y轴, Z轴 旋转的角度
CenterOfRotationX, CenterOfRotationY, CenterOfRotationZ - X轴, Y轴, Z轴 旋转中心点的相对位置(CenterOfRotationX, CenterOfRotationY 默认值为 0.5 , CenterOfRotationZ 默认值为 0)
GlobalOffsetX, GlobalOffsetY, GlobalOffsetZ - 沿 X轴, Y轴, Z轴 的偏移量,此 3 个方向与屏幕的 3 个方向相同
LocalOffsetX, LocalOffsetY, LocalOffsetZ - 沿 X轴, Y轴, Z轴 的偏移量,此 3 个方向与相关的 UIElement 当前的 3 个方向相同 Matrix3DProjection - 矩阵映射
--> <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<Rectangle Width="200" Height="100" StrokeDashArray="3,1" Stroke="Blue" StrokeThickness="3" />
<Rectangle Width="200" Height="100" Fill="Yellow" Stroke="Red" StrokeThickness="3" Opacity="0.3">
<Rectangle.Projection>
<PlaneProjection x:Name="planeProjection" />
</Rectangle.Projection>
</Rectangle>
</Grid> <StackPanel>
<TextBlock FontSize="14.667" Text="RotationX:" Margin="0 10 0 0" />
<Slider Width="150" Minimum="0" Maximum="360" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0 -10 0 0"
Value="{Binding ElementName=planeProjection, Path=RotationX, Mode=TwoWay}" /> <TextBlock FontSize="14.667" Text="RotationY:" Margin="0 -10 0 0" />
<Slider Width="150" Minimum="0" Maximum="360" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0 -10 0 0"
Value="{Binding ElementName=planeProjection, Path=RotationY, Mode=TwoWay}" /> <TextBlock FontSize="14.667" Text="RotationZ:" Margin="0 -10 0 0" />
<Slider Width="150" Minimum="0" Maximum="360" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0 -10 0 0"
Value="{Binding ElementName=planeProjection, Path=RotationZ, Mode=TwoWay}" /> <TextBlock FontSize="14.667" Text="LocalOffsetX:" Margin="0 -10 0 0" />
<Slider Width="150" Minimum="-150" Maximum="150" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0 -10 0 0"
Value="{Binding ElementName=planeProjection, Path=LocalOffsetX, Mode=TwoWay}" /> <TextBlock FontSize="14.667" Text="LocalOffsetY:" Margin="0 -10 0 0" />
<Slider Width="150" Minimum="-150" Maximum="150" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0 -10 0 0"
Value="{Binding ElementName=planeProjection, Path=LocalOffsetY, Mode=TwoWay}" /> <TextBlock FontSize="14.667" Text="LocalOffsetZ:" Margin="0 -10 0 0" />
<Slider Width="150" Minimum="-150" Maximum="150" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0 -10 0 0"
Value="{Binding ElementName=planeProjection, Path=LocalOffsetZ, Mode=TwoWay}" /> <TextBlock FontSize="14.667" Text="GlobalOffsetX:" Margin="0 -10 0 0" />
<Slider Width="150" Minimum="-150" Maximum="150" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0 -10 0 0"
Value="{Binding ElementName=planeProjection, Path=GlobalOffsetX, Mode=TwoWay}" /> <TextBlock FontSize="14.667" Text="GlobalOffsetY:" Margin="0 -10 0 0" />
<Slider Width="150" Minimum="-150" Maximum="150" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0 -10 0 0"
Value="{Binding ElementName=planeProjection, Path=GlobalOffsetY, Mode=TwoWay}" /> <TextBlock FontSize="14.667" Text="GlobalOffsetZ:" Margin="0 -10 0 0" />
<Slider Width="150" Minimum="-150" Maximum="150" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0 -10 0 0"
Value="{Binding ElementName=planeProjection, Path=GlobalOffsetZ, Mode=TwoWay}" />
</StackPanel> </Grid>
</Grid>
</Page>

3、演示 Clip 的应用
Controls/UI/Clip.xaml

<Page
x:Class="XamlDemo.Controls.UI.Clip"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Controls.UI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="120 0 0 0"> <Grid HorizontalAlignment="Left" VerticalAlignment="Top">
<Rectangle Width="200" Height="100" Fill="Red" />
<Rectangle Width="200" Height="100" Fill="Green"> <!--
Clip - 剪裁并显示 UIElement 的指定区域 注:win8 中只能通过 RectangleGeometry 剪裁 UIElement
-->
<Rectangle.Clip>
<RectangleGeometry Rect="10 10 50 50" />
</Rectangle.Clip>
</Rectangle>
</Grid> </StackPanel>
</Grid>
</Page>

4、演示 UseLayoutRounding 的应用
Controls/UI/UseLayoutRounding.xaml

<Page
x:Class="XamlDemo.Controls.UI.UseLayoutRounding"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Controls.UI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="120 0 0 0"> <!--
UseLayoutRounding - 是否使用完整像素布局。默认值为 true
举例:
1、如果设置了Margin="1.6"(非完整像素)
2、那么UseLayoutRounding="true"时,则容器的外边距不相等;UseLayoutRounding="false"时,则容器的外边距相等
-->
<Grid Width="200" Height="200" HorizontalAlignment="Left" UseLayoutRounding="True">
<Border BorderBrush="#FF884909" Background="#FFFBECA3" BorderThickness="1"></Border>
<Border BorderBrush="#FF884909" Background="#FFFBECA3" BorderThickness="1" Margin="1.6"></Border>
</Grid> <Grid Width="200" Height="200" Margin="0 10 0 0" HorizontalAlignment="Left" UseLayoutRounding="False">
<Border BorderBrush="#FF884909" Background="#FFFBECA3" BorderThickness="1"></Border>
<Border BorderBrush="#FF884909" Background="#FFFBECA3" BorderThickness="1" Margin="1.6"></Border>
</Grid> </StackPanel>
</Grid>
</Page>

OK
[源码下载]

重新想象 Windows 8 Store Apps (14) - 控件 UI: RenderTransform, Projection, Clip, UseLayoutRounding的更多相关文章

  1. 重新想象 Windows 8 Store Apps (15) - 控件 UI: 字体继承, Style, ControlTemplate, SystemResource, VisualState, VisualStateManager

    原文:重新想象 Windows 8 Store Apps (15) - 控件 UI: 字体继承, Style, ControlTemplate, SystemResource, VisualState ...

  2. 重新想象 Windows 8 Store Apps (17) - 控件基础: Measure, Arrange, GeneralTransform, VisualTree

    原文:重新想象 Windows 8 Store Apps (17) - 控件基础: Measure, Arrange, GeneralTransform, VisualTree [源码下载] 重新想象 ...

  3. 重新想象 Windows 8 Store Apps (16) - 控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试

    原文:重新想象 Windows 8 Store Apps (16) - 控件基础: 依赖属性, 附加属性, 控件的继承关系, 路由事件和命中测试 [源码下载] 重新想象 Windows 8 Store ...

  4. 重新想象 Windows 8 Store Apps (13) - 控件之 SemanticZoom

    原文:重新想象 Windows 8 Store Apps (13) - 控件之 SemanticZoom [源码下载] 重新想象 Windows 8 Store Apps (13) - 控件之 Sem ...

  5. 重新想象 Windows 8 Store Apps (12) - 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示

    原文:重新想象 Windows 8 Store Apps (12) - 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示 [源码下载] 重新想象 Windows 8 Store Ap ...

  6. 重新想象 Windows 8 Store Apps (11) - 控件之 ListView 和 GridView

    原文:重新想象 Windows 8 Store Apps (11) - 控件之 ListView 和 GridView [源码下载] 重新想象 Windows 8 Store Apps (11) - ...

  7. 重新想象 Windows 8 Store Apps (10) - 控件之 ScrollViewer 特性: Chaining, Rail, Inertia, Snap, Zoom

    原文:重新想象 Windows 8 Store Apps (10) - 控件之 ScrollViewer 特性: Chaining, Rail, Inertia, Snap, Zoom [源码下载] ...

  8. 重新想象 Windows 8 Store Apps (9) - 控件之 ScrollViewer 基础

    原文:重新想象 Windows 8 Store Apps (9) - 控件之 ScrollViewer 基础 [源码下载] 重新想象 Windows 8 Store Apps (9) - 控件之 Sc ...

  9. 重新想象 Windows 8 Store Apps (7) - 控件之布局控件: Canvas, Grid, StackPanel, VirtualizingStackPanel, WrapGrid, VariableSizedWrapGrid

    原文:重新想象 Windows 8 Store Apps (7) - 控件之布局控件: Canvas, Grid, StackPanel, VirtualizingStackPanel, WrapGr ...

随机推荐

  1. 读一读Scktsrvr.exe的源程序

    读一读Scktsrvr.exe的源程序 使用DELPHI做多层开发的朋友们都应该对Scktsrvr.exe这个程序不陌生的,Borland公司在DELPHI中给出了它的源代码.这是一个900来行的程序 ...

  2. Java.util.zip adding a new file overwrites entire jar?(转)

    ZIP and TAR fomats (and the old AR format) allow file append without a full rewrite. However: The Ja ...

  3. Setup SSH and SVN on Windows Server

    cygwin: install sshd, cygrunsrv http://lifehacker.com/205090/geek-to-live--set-up-a-personal-home-ss ...

  4. php编码

    原文:php编码 PHP 页面编码声明与用header或meta实现PHP页面编码的区别     php的header来定义一个php页面为utf编码或GBK编码 php页面为utf编码 header ...

  5. syslog-ng 3.4.3 发布,强烈建议升级 - 开源中国社区

    syslog-ng 3.4.3 发布,强烈建议升级 - 开源中国社区 syslog-ng 3.4.3 发布,强烈建议升级    oschina 发布于: 2013年08月16日 (2评)    分享到 ...

  6. 日交易41.9亿,B2B的魅力为何不输于B2C、C2C?

        在最近两年的电子商务版图中,B2C和C2C可谓大放异彩,相比之下,B2B却显得颇为“低调”,当然,低调并不代表没有影响力,只不过,相比B2C和C2C面向数亿网民而言,B2B只针对企业和商家服务 ...

  7. SPOJ 7001(莫比乌斯反演)

    传送门:Visible Lattice Points 题意:0<=x,y,z<=n,求有多少对xyz满足gcd(x,y,z)=1. 设f(d) = GCD(a,b,c) = d的种类数 : ...

  8. urses.ascii.ispunct(ch):

    Nullege: A Search Engine for Python source code urses.ascii.ispunct(ch): TypeError: 'unicode' object ...

  9. FUDCon - FedoraProject

    FUDCon - FedoraProject FUDCon: Fedora Users and Developers Conference FUD: An acronym for Fear, Unce ...

  10. 开源一个适用iOS的数据库表结构更新机制的代码

    将前段时间开源的代码.公布一下: ARDBConfig On the iOS, provide a database table structure update mechanism, ensure ...