방법: StreamGeometry를 사용하여 도형 만들기
업데이트: 2007년 11월
StreamGeometry는 도형을 만들기 위해 PathGeometry 대신 사용할 수 있는 간단한 클래스입니다. 복잡한 기하 도형을 설명해야 하지만 데이터 바인딩, 애니메이션 및 수정을 지원하는 오버헤드를 원하지 않는 경우 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;
}
}
}