xaml绘图时矢量的。
绘图可以在任何一种布局控件中完成,wpf会根据容器计算相应坐标。最常用的是Canvas和Grid。
基本图形包括以下几个,都是Shaper类的派生类。
- Line,直线段,可以设置Stroke
- Rectangle,有Stroke也有Fill
- Ellipse,椭圆,同上
- Polygon,多边形。由多条直线线段围成的闭合区域,同上。
- Polyline,折线,不闭合,由多条首尾相接的直线段组成
- Path,路径,闭合。可以由若干直线、圆弧、贝塞尔曲线(由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋)组成。很强大。
直线
X1和Y1可以设置起点坐标,X2和Y2可以设置终点坐标。Stroke(笔触)属性的数据类型是Brush(画刷),凡是Brush的派生类都可以给这个属性赋值。
实例
写了个用户控件。StrokeDashArray值越大虚线越疏松,Stroke是颜色,StrokeThickness是粗细,StrokeEndLineCap管的是末端的形状。
<Grid>
<Line X1="10" Y1="20" X2="260" Y2="20" Stroke="Red" StrokeThickness="10"/>
<Line X1="10" Y1="40" X2="260" Y2="40" Stroke="Orange" StrokeThickness="6"/>
<Line X1="10" Y1="60" X2="260" Y2="60" StrokeDashArray="1" Stroke="Black" StrokeThickness="2"/>
<Line X1="10" Y1="80" X2="260" Y2="80" StrokeDashArray="2" Stroke="Black" StrokeThickness="2"/>
<Line X1="10" Y1="100" X2="260" Y2="100" StrokeDashArray="3" Stroke="Black" StrokeThickness="2"/>
<Line X1="10" Y1="120" X2="260" Y2="120" StrokeEndLineCap="Flat" Stroke="Blue" StrokeThickness="3"/>
<Line X1="10" Y1="140" X2="260" Y2="140" StrokeEndLineCap="Round" Stroke="Blue" StrokeThickness="3"/>
<Line X1="10" Y1="160" X2="260" Y2="160" StrokeEndLineCap="Square" Stroke="Blue" StrokeThickness="3"/>
<Line X1="10" Y1="180" X2="260" Y2="180" StrokeEndLineCap="Triangle" StrokeThickness="10">
<Line.Stroke>
<LinearGradientBrush EndPoint="0,0.5" StartPoint="1,0.5">
<GradientStop Color="Brown"/>
<GradientStop Offset="1"/>
</LinearGradientBrush>
</Line.Stroke>
</Line>
</Grid>
矩形
矩形有Stroke和Fill。Stroke的设置与直线的相同,Fill的数据类型是Brush。同理,Brush的派生类也可以给它赋值。
实例
<UserControl x:Class="pxy.DiffBrush"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:pxy"
mc:Ignorable="d"
d:DesignHeight="390" d:DesignWidth="600">
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="160"/>
<RowDefinition Height="10"/>
<RowDefinition Height="160"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="180"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="180"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="180"/>
</Grid.ColumnDefinitions>
<!--实心填充-->
<Rectangle Grid.Column="0" Grid.Row="0" Stroke="Black" Fill="LightBlue"/>
<!--线性渐变-->
<Rectangle Grid.Column="2" Grid.Row="0">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FFB6F8F1" Offset="0"/>
<GradientStop Color="#FF0082BD" Offset="0.25"/>
<GradientStop Color="#FF95DEFF" Offset="0.6"/>
<GradientStop Color="#FF004F72" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<!--径向渐变-->
<Rectangle Grid.Column="4" Grid.Row="0">
<Rectangle.Fill>
<RadialGradientBrush>
<GradientStop Color="#FFB6F8F1" Offset="0"/>
<GradientStop Color="#FF0082BD" Offset="0.25"/>
<GradientStop Color="#FF95DEFF" Offset="0.75"/>
<GradientStop Color="#FF004F72" Offset="1"/>
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<!--图片填充-->
<Rectangle Grid.Column="0" Grid.Row="2">
<Rectangle.Fill>
<ImageBrush ImageSource="/Resources/Logos/huaji.jpg" TileMode="Tile" Viewport="0,0,0.5,0.5"/>
</Rectangle.Fill>
</Rectangle>
<!--矢量图填充,自定义图形-->
<Rectangle Grid.Column="2" Grid.Row="2">
<Rectangle.Fill>
<DrawingBrush TileMode="Tile" Viewport="0,0,0.2,0.2">
<DrawingBrush.Drawing>
<GeometryDrawing Brush="LightBlue">
<GeometryDrawing.Geometry>
<EllipseGeometry RadiusX="10" RadiusY="10"/>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingBrush.Drawing>
</DrawingBrush>
</Rectangle.Fill>
</Rectangle>
<!--无填充,用线性渐变填充border-->
<Rectangle Grid.Column="4" Grid.Row="2" StrokeThickness="10">
<Rectangle.Stroke>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="White" Offset="0.3"/>
<GradientStop Color="Blue" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Stroke>
</Rectangle>
</Grid>
</UserControl>
VisualBrush实例:改变按钮颜色的透明度
<UserControl x:Class="pxy.VisualBrushTest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:pxy"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400" Background="Orange">
<Grid Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="160"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="160"/>
</Grid.ColumnDefinitions>
<StackPanel x:Name="stackPanelLeft" Background="White">
<Button x:Name="realButton" Content="OK" Height="40"/>
</StackPanel>
<Button Content=">>>" Grid.Column="1" Margin="5,0" Click="VisualBrush_Click"/>
<StackPanel x:Name="stackPanelRight" Background="White" Grid.Column="2"/>
</Grid>
</UserControl>
后台
double o = 1.0; // 不透明度计数器
private void VisualBrush_Click(object sender, RoutedEventArgs e)
{
VisualBrush visualBrush = new VisualBrush(this.realButton);
Rectangle rect = new Rectangle();
rect.Width = this.realButton.ActualWidth;
rect.Height = this.realButton.ActualHeight;
rect.Fill = visualBrush;
rect.Opacity = o;
o -= 0.2;
// 别漏了
this.stackPanelRight.Children.Add(rect);
}
椭圆
Width==Height就是正圆。光影效果可以用RadicalGradientBrush实现。
这些可以在blend里调整,然后代码微调。1.规整数值(毕竟机器会出很多太过精确的数值)2.调整顺序;3.去掉无用代码。
<Grid>
<Ellipse Height="200" Stroke="Gray" Width="200">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin="0.2,0.8" RadiusX="0.75" RadiusY="0.75">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<RotateTransform Angle="90" CenterX="0.5" CenterY="0.5"/>
<TranslateTransform/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Color="#FFFFFFFF" Offset="0"/>
<GradientStop Color="#FF444444" Offset="0.6"/>
<GradientStop Color="#FF999999" Offset="1"/>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Grid>