WPF中繪畫和動畫(3)
1. 矩形
矩形由筆觸(Stroke,即邊線)和填充(Fill)構成。Stroke屬性的設置於Line一樣,Fill屬性的資料型別是Brush。Brush是個抽象類,所以我們不可能拿一個Brush類的例項為Fill屬性賦值而只能用Brush派生類的例項進行賦值。
WPF的繪畫系統包含非常豐富的Brush型別,常用的有:
(1) SolidColorBrush:實心畫刷。在XAML中可以使用顏色名稱字串(如Red、Blu)直接賦值。
(2) LinearGradientBrush:線性漸變畫刷。色彩豔設定的直線方向、按設定的變化點進行漸變。
(3) RadialGradientBrush:徑向漸變畫刷。色彩沿半徑的方向、按設定的變化點進行漸變,形成圓形填充。
(4) ImageBrush:使用圖片(Image)作為填充內容。
(5) DrawingBrush:使用向量圖(Vector)和點陣圖(Bitmap)作為填充內容。
(6) VisualBrush:WPF中的每個控制元件都是由FrameworkElement類派生來的,而FrameworkElement又是由Visual類派生來的。Visual意為“可視”之意,每個控制元件的視覺化形象就可以通過Visual類的方法獲得。獲得這個視覺化的形象後,我們可以用這個形象進行填充,這就是VisualBrush。比如當我想把窗體上的某個控制元件拽到另一個位置,當滑鼠鬆開之前需要在滑鼠只指標下顯現一個控制元件的“幻影”,這個“幻影”就是用VisualBrush填充出來的一個矩形,並讓矩形捕捉滑鼠的位置、隨滑鼠移動。
下面是用各種畫刷填充矩形的綜合例項:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Rectangle and Brush" Height="390" Width="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.5"/>
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
<!--圖片填充-->
<Rectangle Grid.Column="0" Grid.Row="2">
<Rectangle.Fill>
<ImageBrush ImageSource=".\Images\logo.bmp" Viewport="0,0,0.3,0.15" TileMode="Tile"/>
</Rectangle.Fill>
</Rectangle>
<!--向量圖填充-->
<Rectangle Grid.Column="2" Grid.Row="2">
<Rectangle.Fill>
<DrawingBrush Viewport="0,0,0.2,0.2" TileMode="Tile">
<DrawingBrush.Drawing>
<GeometryDrawing Brush="LightBlue">
<GeometryDrawing.Geometry>
<EllipseGeometry RadiusX="10" RadiusY="10"/>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingBrush.Drawing>
</DrawingBrush>
</Rectangle.Fill>
</Rectangle>
<!—無填充,用線性漸變填充邊線-->
<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="Black" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Stroke>
</Rectangle>
</Grid>
</Window>
實際效果如圖2所示: