DotNet关键知识点——WPF篇(三)

来源:互联网 发布:剑雨江湖602进阶数据 编辑:程序博客网 时间:2024/06/05 09:52

1. 画刷
1.1 渐变画刷(Gradient Brushes)
主要包括线性渐变和辐射渐变,两者都作用在一个矩形填色区域上,用[0,1]×[0,1]覆盖。
线性渐变(LinearGradientBrush ):StartPoint和EndPoint用来指定渐变路径(直线),等色线与渐变路径垂直。用GradientStop单元定义渐变路径上的点,其Color属性为这个点上颜色,Offset属性为0到1,表示经过渐变路径的比例。第一个GradientStop之前和最后一个之后渐变路径上的点的颜色分别为这两个点的颜色。当沿渐变路径填色没有覆盖整个区域时,剩余区域的填色方法由LinearGradientBrush.SpreadMethod(课本上有误)属性指定,分别是Pad, Reflect和Repeat。
辐射渐变(RadialGradientBrush):其等色线为等比例轴椭圆族,渐变路径是和椭圆族垂直的辐射线。椭圆长短轴用属性RadiusX和RadiusY描述,中心用Center描述。GradientStop的含义类似。

1.2 图片画刷(Image Brush)
ImageSource用于指定图片文件
Strech用于指定图片的填充方式(同Image类)
ViewBox=”X,Y,Width,Height”用于取子图像
TileMode用于在Strech为None的时候指定周期性贴图模式。

1.3 视图画刷(Visual Brush)
视图画刷以Visual=”{Binding ElementName=???}”(Visual类型)将一个控件的面貌显示到当前区域。

2. 图形(shape)
图形均继承自Shape( : FrameworkElement)类。Fill属性为填色刷,Stroke为轮廓刷,StrokeThickness为轮廓粗细,Stretch类似Image。
Polygon和PolyLine用Points=”X1,Y1 X2,Y2, …”格式定义顶点。
Polygon和Polyline中封闭区域的填色方式用FillRule定义:EvenOdd——当填色区域沿射线到图形外跨越的边界数为偶数时填色;NonZero——从直线两个方向到图形外跨越边界数相等时填色。因此一个交叉连线的五角星,用EvenOdd只有五个角着色,用NonZero则全部着色。

Path的内部图形用Geometry Path.Data定义,而每个图形元素都继承自Geometry( : Animatable : Freezable : DependencyObject) ,Geometry对象主要包括:
- 基本图形Geometry,如EllipseGeometry,LineGeometry,RectangleGeometry等,使用和对应图形类似。
- GeometryGroup用来组合图形,FillRule属性用于指定填充方式,类似Polygon/Polyline。
- CombinedGeometry的GeometryCombineMode属性用以指定组合操作:Exclude对Geometry1和Geometry2做减法,Intersect取交,Xor取异或(交的反),Union取并。
- 其他如:PathGeometry,StreamGeometry(轻量级PathGeometry)等。
用Geometry绘制2次Bezier曲线:Geometry.Parse("M 起始点 Q 控制点 终止点")或XAML中直接设Path的Data。

GeometryDrawing( : Drawing)类的Geometry属性也是一个Geometry对象。Image.Source是ImageSource类型,而DrawingImage继承自ImageSource,DrawingImage的Drawing属性则是Drawing抽象类型。由此可通过绘画产生一个Image。

3. 变换 

单元的RenderTransformOrigin用以指定变换中坐标原点在控件中的位置,用[0,1]×[0,1]坐标系,以下Center?和Offset?(以像素为单位)均从此出发,默认为"0, 0"。UIElement的RenderTransform属性用来指定到变换器。所以图形和控件都能变换。(FrameworkElement的LayoutTransform则会在变换过程中调整布局,详见参考资料)
MatrixTransform用2D仿射变换矩阵Matrix属性定义,变换过程:
[x’]   [M11 M12] [x]   [OffsetX]
[y’] = [M21 M22] [y] + [OffsetY]
RotateTransform用Angle控制,变换过程:
[x’]   [cos(Angle)  sin(Angle)] [x – CenterX]   [CenterX]
[y’] = [sin(Angle) –sin(Angle)] [y – CenterY] + [CenterY]

SkewTransform用AngelX和AngelY控制,变换过程:
[x’]   [1  tan(AngleX)] [x – CenterX]   [CenterX]
[y’] = [tan(AngleY)  1] [y – CenterY] + [CenterY]
ScaleTransform用ScaleX和ScaleY属性控制,变换过程:
[x’]   [ScaleX 0] [x – CenterX]   [CenterX]
[y’] = [0 ScaleY] [y – CenterY] + [CenterY]
TranslateTransform用X和Y属性控制,变换过程:
[x’]   [1 0] [x]   [X]
[y’] = [0 1] [y] + [Y]

4. 切割

调控件或形状的UIElement.Clip属性,内容则是相应的Geometry对象。

5. 视图树工具VisualTreeHelper
HitTestResult VisualTreeHelper.HitTest(Visual v, Point p),用来检测起始于v单元的视图树中位于最上层的单元。

6. 相关类继承结构

DependencyObject - Freezable - Animatable – Geometry – Rectangle~, Ellipse~, Line~
                                                     - Combined~, ~Group, Path~, Stream~
                                          - Brush – GradientBrush – LinearGradientBrush
                                                                  - RadialGradientBrush
                                          - GeneralTransform – Transform – Matrix~, 
                                                                         - Rotate~, Scale~, Skew~
                                                                         - Translate~
                                                                         - TransformGroup
                  - Visual – UIElement – FrameworkElement – Shape – Rectangle
                                                                 - Ellipse
                                                                 - Polygon, Polyline
                                                                 - Path

参考资料:
1.
Tranforms overview http://msdn.microsoft.com/library/ms750596.aspx
2. LayoutTransform vs RenderTransform:
http://www.charlespetzold.com/blog/2006/03/RenderTransformVersusLayoutTransform.xaml