HOW TO:使用 StreamGeometry 建立圖案
更新:2007 年 11 月
StreamGeometry 是 PathGeometry 的輕量 (Light-Weight) 替代方式,用於建立幾何圖案。當您需要描述複雜幾何圖案,但是不想要有支援資料繫結、動畫或修改的額外負荷時,請使用 StreamGeometry。例如,StreamGeometry 類別因為十分具有效率,所以是描述 Adorner 的好選擇。
範例
下列範例使用屬性語法,在 XAML 中建立三角形 StreamGeometry。
<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<Path Data="F0 M10,100 L100,100 100,50Z"
StrokeThickness="1" Stroke="Black"/>
</StackPanel>
</Page>
如需 StreamGeometry 屬性語法的詳細資訊,請參閱路徑標記語法頁面。
下一個範例使用 StreamGeometry,以程式碼定義三角形。範例會先建立 StreamGeometry,然後取得 StreamGeometryContext,再使用它來描述三角形。
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
namespace SDKSample
{
// Use StreamGeometry with StreamGeometryContext to define a triangle shape.
public partial class StreamGeometryTriangleExample : Page
{
public StreamGeometryTriangleExample()
{
// Create a path to draw a geometry with.
Path myPath = new Path();
myPath.Stroke = Brushes.Black;
myPath.StrokeThickness = 1;
// Create a StreamGeometry to use to specify myPath.
StreamGeometry geometry = new StreamGeometry();
geometry.FillRule = FillRule.EvenOdd;
// Open a StreamGeometryContext that can be used to describe this StreamGeometry
// object's contents.
using (StreamGeometryContext ctx = geometry.Open())
{
// Begin the triangle at the point specified. Notice that the shape is set to
// be closed so only two lines need to be specified below to make the triangle.
ctx.BeginFigure(new Point(10, 100), true /* is filled */, true /* is closed */);
// Draw a line to the next specified point.
ctx.LineTo(new Point(100, 100), true /* is stroked */, false /* is smooth join */);
// Draw another line to the next specified point.
ctx.LineTo(new Point(100, 50), true /* is stroked */, false /* is smooth join */);
}
// Freeze the geometry (make it unmodifiable)
// for additional performance benefits.
geometry.Freeze();
// Specify the shape (triangle) of the Path using the StreamGeometry.
myPath.Data = geometry;
// Add path shape to the UI.
StackPanel mainPanel = new StackPanel();
mainPanel.Children.Add(myPath);
this.Content = mainPanel;
}
}
}
下一個範例建立的方法會使用 StreamGeometry 和 StreamGeometryContext,根據所指定的參數來定義幾何圖案。
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
namespace SDKSample
{
public partial class StreamGeometryExample : Page
{
public StreamGeometryExample()
{
// Create a path to draw a geometry with.
Path myPath = new Path();
myPath.Stroke = Brushes.Black;
myPath.StrokeThickness = 1;
// Create a StreamGeometry to use to specify myPath.
StreamGeometry theGeometry = BuildRegularPolygon(new Point(200, 200), 200, 8, 0);
theGeometry.FillRule = FillRule.EvenOdd;
// Freeze the geometry (make it unmodifiable)
// for additional performance benefits.
theGeometry.Freeze();
// Use the StreamGeometry returned by the BuildRegularPolygon to
// specify the shape of the path.
myPath.Data = theGeometry;
// Add path shape to the UI.
StackPanel mainPanel = new StackPanel();
mainPanel.Children.Add(myPath);
this.Content = mainPanel;
}
StreamGeometry BuildRegularPolygon(Point c, double r, int numSides, double offsetDegree)
{
// c is the center, r is the radius,
// numSides the number of sides, offsetDegree the offset in Degrees.
// Do not add the last point.
StreamGeometry geometry = new StreamGeometry();
using (StreamGeometryContext ctx = geometry.Open())
{
ctx.BeginFigure(new Point(), true /* is filled */, true /* is closed */);
double step = 2 * Math.PI / Math.Max(numSides, 3);
Point cur = c;
double a = Math.PI * offsetDegree / 180.0;
for (int i = 0; i < numSides; i++, a += step)
{
cur.X = c.X + r * Math.Cos(a);
cur.Y = c.Y + r * Math.Sin(a);
ctx.LineTo(cur, true /* is stroked */, false /* is smooth join */);
}
}
return geometry;
}
}
}