[关闭]
@kuier1992 2015-09-10T01:46:09.000000Z 字数 2559 阅读 2080

形状、画刷和变换

C#


WPF有一个非常不同的原则,它以相同方式处理预先构建的空间和自定义绘制的图形。

理解形状

绘制2D图形最简单方法是使用shape--专门用于表示简单的直线、椭圆、举行以及多边形的一些类。
关于WPF中形状的重要细节是,他们都继承自FrameworkElement类,因此形状是元素(是不是和控件是类似的)。

Shape类

每个形状都继承自抽象类System.Windows.Shapes.Shape
继承层次
Line:直线 Ellipse:椭圆形 Rectangle:矩形 Polyline 折线 Polygon:多边形 Path:能将多个基本形状组合成单独的元素

矩形和椭圆

  1. <StackPanel>
  2. //边框内为黄色,边框为蓝色
  3. <Ellipse Fill="Yellow" Stroke="Blue" Height="50" Width="100" Margin="5" HorizontalAlignment="Left"></Ellipse>
  4. //Radius用于是边角更加圆润。如果RadiusX属性的值使其等于矩形宽度,Radius的值等于高度,则变成一个椭圆
  5. <Rectangle Fill="Yellow" Stroke="Black" Height=" 50" Width="50" HorizontalAlignment="Left" RadiusX="10" RadiusY="10"></Rectangle>
  6. </StackPanel>

改变形状的尺寸和放置形状

可以使用Grid容器构造更好的示例。

  1. <Grid>
  2. <Ellipse Fill = "Yellow" stroke = "Blue" ></Ellipse>
  3. </Grid>

改变形状尺寸的行为依赖于Stretch的值。默认情况下,该值为Fill。如果没有制定明确的值,这一设置会拉伸形状,使其填满容器。
Stretch枚举值
如何将他们放到和是的位置呢,理想容器是Canvas,该容器要求使用Left、Top、Right、Buttom附加属性,为每个形状制定坐标。

  1. <Canvas Grid.Row="1">
  2. <Ellipse Fill="Yellow" Stroke="Blue" Canvas.Left="100" Canvas.Top="50" Width="100" Height="50" ></Ellipse>
  3. <Rectangle Fill="Yellow" Stroke="Blue" Canvas.Left="30" Canvas.Top="40" Width="100" Height="50" ></Rectangle>
  4. </Canvas>

使用ViewBox控件缩放形状

使用Canvas控件的唯一限制是图形不能改变自身的尺寸以适应更大或更小的窗口。使用Viewbox可以方便的改变尺寸形状。通常将Viewbox控件中放置Canvas面板,并在Canvas中放置形状。

  1. <Viewbox Grid.Row="1" HorizontalAlignment="Left" MaxHeight="500">
  2. <Canvas Width="200" Height="150">
  3. <Ellipse Fill="Yellow" Stroke="Blue" Canvas.Left="10" Canvas.Top="50" Width="100" Height="50" HorizontalAlignment="Left"></Ellipse>
  4. <Rectangle Fill="Yellow" Stroke="Blue" Canvas.Left="30" Canvas.Top="40" Width="100" Height="50" HorizontalAlignment="Left"></Rectangle>
  5. </Canvas>
  6. </Viewbox>

直线

Line形状表示连接一个点和另一点的一条直线。

  1. <Line Stroke = "Blue" x1="0" Y1 = "0" X2= "10" Y2 = "100"></Line>

对于直线,Fill属性不起作用,必须设置Stroke属性。在直线中使用的坐标是相对于放置直线的矩形区域的左上角的坐标(这里需要好好理解)。

折线

可以通过Polyline绘制一系列相互连接的直线。只需要使用Points属性提供一系列X和Y坐标。Point属性需要使用PointCollection对象。但在XAML中,只需提供点的列表,中间加空格或逗号即可。

  1. <Polyline Stroke = "Blue" Points="5,100 15,200"></Polyline>

多边形

Polyline和Polygon的区别
Polygon相撞添加最后一条线段,将最后一点连接到开始点。Polyline 不会。

画刷

画刷类
所有的画刷都位于System.Windows.Media命名空间内

SolidColorBrush类

最简单的用法

  1. cmd.Background = new SolidColorBrush(Colors.AliceBlue);
  2. cmd.Background = SystemColors.ControlBrush;
  3. cmd.Foreground = new SolidColorBrush(Color.FromRgb(0,255,0));

LinearGradientBrush画刷

渐变画刷

  1. <Rectangle Width="150" Height="100" Margin="5">
  2. <Rectangle.Fill>
  3. <LinearGradientBrush >
  4. <GradientStop Color="Blue" Offset="0"/>
  5. <GradientStop Color="White" Offset="1" />
  6. </LinearGradientBrush>
  7. </Rectangle.Fill>
  8. </Rectangle>

ImageBrush画刷

  1. <ImageBrush ImageSource="logo.gif" Stretch="None"></ImageBrush>

ImageBrush画刷还可以平铺,选择按比例平铺或者按固定尺寸平铺

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注