Przegląd Geometria

W tym omówieniu opisano sposób używania klas programu Windows Presentation Foundation (WPF) Geometry do opisywania kształtów. W tym temacie przedstawiono również różnice między Geometry obiektami i Shape elementami.

Co to jest geometria?

Klasa Geometry i klasy, które pochodzą z niej, takie jak EllipseGeometry, PathGeometryi CombinedGeometry, umożliwiają opisanie geometrii kształtu 2D. Te opisy geometryczne mają wiele zastosowań, takich jak definiowanie kształtu do malowania na ekranie lub definiowanie regionów testów trafień i klipów. Można nawet użyć geometrii do zdefiniowania ścieżki animacji.

Geometry obiekty mogą być proste, takie jak prostokąty i okręgi lub złożone, utworzone na podstawie co najmniej dwóch obiektów geometrycznych. Bardziej złożone geometrie można tworzyć przy użyciu PathGeometry klas i StreamGeometry , które umożliwiają opisywanie łuków i krzywych.

Ponieważ obiekt jest typem GeometryFreezable, Geometry obiekty zapewniają kilka specjalnych funkcji: można je zadeklarować jako zasoby, współdzielone między wieloma obiektami, wykonane tylko do odczytu w celu poprawy wydajności, sklonowania i bezpiecznego wątku. Aby uzyskać więcej informacji na temat różnych funkcji udostępnianych przez Freezable obiekty, zobacz Omówienie obiektów z możliwością zamrażania.

Geometrie a kształty

Klasy Geometry i Shape wydają się podobne, ponieważ opisują kształty 2D (porównaj EllipseGeometry i Ellipse na przykład), ale istnieją ważne różnice.

Dla jednego klasa dziedziczy z klasy, Geometry podczas gdy Shape klasa dziedziczy z FrameworkElementFreezable klasy . Ponieważ są to elementy, Shape obiekty mogą renderować się i uczestniczyć w systemie układu, podczas gdy Geometry obiekty nie mogą.

Chociaż Shape obiekty są bardziej łatwo użyteczne niż Geometry obiekty, Geometry obiekty są bardziej uniwersalne. Shape Podczas gdy obiekt jest używany do renderowania grafiki 2D, Geometry obiekt może służyć do definiowania regionu geometrycznego dla grafiki 2D, definiowania regionu do wycinków lub definiowania regionu na potrzeby testowania trafień, na przykład.

Kształt ścieżki

Jedna Shapeklasa Path , faktycznie używa klasy Geometry do opisania jego zawartości. Ustawiając właściwość obiektu za pomocą właściwości Geometry i i FillStroke , można renderować element Geometry.PathData

Typowe właściwości, które przyjmują geometrię

W poprzednich sekcjach wspomniano, że obiekty Geometry mogą być używane z innymi obiektami w różnych celach, takich jak rysowanie kształtów, animowanie i wycinanie. W poniższej tabeli wymieniono kilka klas, które mają właściwości, które przyjmują Geometry obiekt.

Type Właściwości
DoubleAnimationUsingPath PathGeometry
DrawingGroup ClipGeometry
GeometryDrawing Geometry
Path Data
UIElement Clip

Proste typy geometrii

Klasa bazowa dla wszystkich geometrii jest klasą Geometryabstrakcyjną . Klasy pochodzące z Geometry klasy mogą być w przybliżeniu zgrupowane w trzy kategorie: proste geometrie, geometrie ścieżek i geometrie złożone.

Proste klasy geometryczne obejmują LineGeometry, RectangleGeometryi EllipseGeometry i służą do tworzenia podstawowych kształtów geometrycznych, takich jak linie, prostokąty i okręgi.

  • Element A LineGeometry jest definiowany przez określenie punktu początkowego linii i punktu końcowego.

  • Element RectangleGeometry jest definiowany za pomocą Rect struktury, która określa jego względną pozycję oraz wysokość i szerokość. Prostokąt zaokrąglony można utworzyć, ustawiając RadiusX właściwości i RadiusY .

  • Element EllipseGeometry jest definiowany przez punkt środkowy, promień x i promień y. W poniższych przykładach pokazano, jak utworzyć proste geometrie na potrzeby renderowania i tworzenia wycinków.

Te same kształty, a także bardziej złożone kształty, można tworzyć przy użyciu obiektu PathGeometry lub przez połączenie obiektów geometrycznych ze sobą, ale te klasy zapewniają prostsze sposoby tworzenia tych kształtów geometrycznych.

W poniższym przykładzie pokazano, jak utworzyć i renderować element LineGeometry. Jak wspomniano wcześniej, Geometry obiekt nie może rysować się, więc w przykładzie Path użyto kształtu do renderowania linii. Ponieważ linia nie ma obszaru, ustawienie Fill właściwości obiektu Path nie miałoby żadnego efektu; zamiast tego określono tylko Stroke właściwości i StrokeThickness . Poniższa ilustracja przedstawia dane wyjściowe z przykładu.

A LineGeometry
LiniaGeometry pobrana z (10 20) do (100 130)

<Path Stroke="Black" StrokeThickness="1" >
  <Path.Data>
    <LineGeometry StartPoint="10,20" EndPoint="100,130" />
  </Path.Data>
</Path>
LineGeometry myLineGeometry = new LineGeometry();
myLineGeometry.StartPoint = new Point(10,20);
myLineGeometry.EndPoint = new Point(100,130);

Path myPath = new Path();
myPath.Stroke = Brushes.Black;
myPath.StrokeThickness = 1;
myPath.Data = myLineGeometry;
Dim myLineGeometry As New LineGeometry()
myLineGeometry.StartPoint = New Point(10,20)
myLineGeometry.EndPoint = New Point(100,130)

Dim myPath As New Path()
myPath.Stroke = Brushes.Black
myPath.StrokeThickness = 1
myPath.Data = myLineGeometry

W następnym przykładzie pokazano, jak utworzyć i renderować element EllipseGeometry. Przykłady ustawiają wartość Center parametru EllipseGeometry na punkt 50,50 , a promień x i promień y są ustawione na 50wartość , co powoduje utworzenie okręgu o średnicy 100. Wnętrze wielokropka jest malowane przez przypisanie wartości do właściwości Fill elementu Path, w tym przypadku Gold. Poniższa ilustracja przedstawia dane wyjściowe z przykładu.

An EllipseGeometry
EllipseGeometry rysowany na (50 50 50)

<Path Fill="Gold" Stroke="Black" StrokeThickness="1">
  <Path.Data>
    <EllipseGeometry Center="50,50" RadiusX="50" RadiusY="50" />
  </Path.Data>
</Path>
EllipseGeometry myEllipseGeometry = new EllipseGeometry();
myEllipseGeometry.Center = new Point(50, 50);
myEllipseGeometry.RadiusX = 50;
myEllipseGeometry.RadiusY = 50;

Path myPath = new Path();
myPath.Fill = Brushes.Gold;
myPath.Stroke = Brushes.Black;
myPath.StrokeThickness = 1;
myPath.Data = myEllipseGeometry;
Dim myEllipseGeometry As New EllipseGeometry()
myEllipseGeometry.Center = New Point(50, 50)
myEllipseGeometry.RadiusX = 50
myEllipseGeometry.RadiusY = 50

Dim myPath As New Path()
myPath.Fill = Brushes.Gold
myPath.Stroke = Brushes.Black
myPath.StrokeThickness = 1
myPath.Data = myEllipseGeometry

W poniższym przykładzie pokazano, jak utworzyć i renderować element RectangleGeometry. Położenie i wymiary prostokąta są definiowane przez Rect strukturę. Pozycja to 50,50 , a wysokość i szerokość to , 25co tworzy kwadrat. Poniższa ilustracja przedstawia dane wyjściowe z przykładu.

A RectangleGeometry
ProstokątGeometry narysowany na 50 50 50

<Path Fill="LemonChiffon" Stroke="Black" StrokeThickness="1">
  <Path.Data>
    <RectangleGeometry Rect="50,50,25,25" />
  </Path.Data>
</Path>
RectangleGeometry myRectangleGeometry = new RectangleGeometry();
myRectangleGeometry.Rect = new Rect(50,50,25,25);

Path myPath = new Path();
myPath.Fill = Brushes.LemonChiffon;
myPath.Stroke = Brushes.Black;
myPath.StrokeThickness = 1;
myPath.Data = myRectangleGeometry;
Dim myRectangleGeometry As New RectangleGeometry()
myRectangleGeometry.Rect = New Rect(50,50,25,25)

Dim myPath As New Path()
myPath.Fill = Brushes.LemonChiffon
myPath.Stroke = Brushes.Black
myPath.StrokeThickness = 1
myPath.Data = myRectangleGeometry

W poniższym przykładzie pokazano, jak używać EllipseGeometry obiektu jako regionu klipu dla obrazu. Obiekt Image jest definiowany z wartością Width 200 i Height 150. Obiekt EllipseGeometry o RadiusX wartości 100, RadiusY wartość 75 i Center wartość 100 75 jest ustawiona na Clip właściwość obrazu. Zostanie wyświetlona tylko część obrazu znajdującego się w obszarze wielokropka. Poniższa ilustracja przedstawia dane wyjściowe z przykładu.

An Image with and without clipping
WielokropekGeometry używany do przycinania kontrolki Obraz

<Image
  Source="sampleImages\Waterlilies.jpg"
  Width="200" Height="150" HorizontalAlignment="Left">
  <Image.Clip>
    <EllipseGeometry
      RadiusX="100"
      RadiusY="75"
      Center="100,75"/>
  </Image.Clip>
</Image>

// Create the image to clip.
Image myImage = new Image();
Uri imageUri =
    new Uri(@"C:\\Documents and Settings\\All Users\\Documents\My Pictures\\Sample Pictures\\Water lilies.jpg", UriKind.Relative);
myImage.Source = new BitmapImage(imageUri);
myImage.Width = 200;
myImage.Height = 150;
myImage.HorizontalAlignment = HorizontalAlignment.Left;

// Use an EllipseGeometry to define the clip region.
EllipseGeometry myEllipseGeometry = new EllipseGeometry();
myEllipseGeometry.Center = new Point(100, 75);
myEllipseGeometry.RadiusX = 100;
myEllipseGeometry.RadiusY = 75;
myImage.Clip = myEllipseGeometry;


' Create the image to clip.
Dim myImage As New Image()
Dim imageUri As New Uri("C:\\Documents and Settings\\All Users\\Documents\My Pictures\\Sample Pictures\\Water lilies.jpg", UriKind.Relative)
myImage.Source = New BitmapImage(imageUri)
myImage.Width = 200
myImage.Height = 150
myImage.HorizontalAlignment = HorizontalAlignment.Left

' Use an EllipseGeometry to define the clip region. 
Dim myEllipseGeometry As New EllipseGeometry()
myEllipseGeometry.Center = New Point(100, 75)
myEllipseGeometry.RadiusX = 100
myEllipseGeometry.RadiusY = 75
myImage.Clip = myEllipseGeometry

Geometrie ścieżek

Klasa PathGeometry i jej lekki odpowiednik StreamGeometry , klasa, zapewniają środki do opisywania wielu złożonych postaci składających się z łuków, krzywych i linii.

Sercem obiektu PathGeometry jest kolekcja PathFigure obiektów, tak nazwanych, ponieważ każdy rysunek opisuje dyskretny kształt w obiekcie PathGeometry. Każdy PathFigure z nich składa się z co najmniej jednego PathSegment obiektu, z których każdy opisuje segment rysunku.

Istnieje wiele typów segmentów.

Typ segmentu opis Przykład
ArcSegment Tworzy wielokropek łuku między dwoma punktami. Utwórz łuk wielokropowy.
BezierSegment Tworzy krzywą beziera sześcienną między dwoma punktami. Utwórz krzywą Beziera sześciennego.
LineSegment Tworzy linię między dwoma punktami. Tworzenie obiektu LineSegment w elemencie PathGeometry
PolyBezierSegment Tworzy serię sześciennych krzywych Beziera. PolyBezierSegment Zobacz stronę typu.
PolyLineSegment Tworzy serię wierszy. PolyLineSegment Zobacz stronę typu.
PolyQuadraticBezierSegment Tworzy serię krzywych Beziera kwadratowego. PolyQuadraticBezierSegment Zobacz stronę.
QuadraticBezierSegment Tworzy krzywą Beziera kwadratowego. Utwórz krzywą Beziera kwadratowego.

Segmenty w obrębie elementu PathFigure są łączone w jeden kształt geometryczny z punktem końcowym każdego segmentu będącego punktem początkowym następnego segmentu. Właściwość StartPoint obiektu PathFigure określa punkt, z którego jest rysowany pierwszy segment. Każdy kolejny segment rozpoczyna się od punktu końcowego poprzedniego segmentu. Można na przykład zdefiniować pionową linię z 10,50 do 10,150 , ustawiając StartPoint właściwość na 10,50 i tworząc element LineSegment z ustawieniem Point10,150właściwości .

Poniższy przykład tworzy prosty PathGeometry element składający się z pojedynczego PathFigure obiektu i LineSegment wyświetla go przy użyciu Path elementu . Obiekt PathFigure jest ustawiony na 10,20 wartość , a element LineSegment jest zdefiniowany za pomocą punktu końcowego 100,130.StartPoint Na poniższej PathGeometry ilustracji przedstawiono utworzone w tym przykładzie.

A LineGeometry
PathGeometry, który zawiera pojedynczą linięSegment

<Path Stroke="Black" StrokeThickness="1">
  <Path.Data>
    <PathGeometry>
      <PathGeometry.Figures>
        <PathFigure StartPoint="10,20">
          <PathFigure.Segments>
            <LineSegment Point="100,130"/>
          </PathFigure.Segments>
        </PathFigure>
      </PathGeometry.Figures>
    </PathGeometry>
  </Path.Data>
</Path>

// Create a figure that describes a
// line from (10,20) to (100,130).
PathFigure myPathFigure = new PathFigure();
myPathFigure.StartPoint = new Point(10,20);
myPathFigure.Segments.Add(
    new LineSegment(new Point(100,130),
    true /* IsStroked */ ));

/// Create a PathGeometry to contain the figure.
PathGeometry myPathGeometry = new PathGeometry();
myPathGeometry.Figures.Add(myPathFigure);

// Display the PathGeometry.
Path myPath = new Path();
myPath.Stroke = Brushes.Black;
myPath.StrokeThickness = 1;
myPath.Data = myPathGeometry;

' Create a figure that describes a 
' line from (10,20) to (100,130).
Dim myPathFigure As New PathFigure()
myPathFigure.StartPoint = New Point(10,20)
myPathFigure.Segments.Add(New LineSegment(New Point(100,130), True)) ' IsStroked 

''' Create a PathGeometry to contain the figure.
Dim myPathGeometry As New PathGeometry()
myPathGeometry.Figures.Add(myPathFigure)

' Display the PathGeometry. 
Dim myPath As New Path()
myPath.Stroke = Brushes.Black
myPath.StrokeThickness = 1
myPath.Data = myPathGeometry

Warto porównać ten przykład z poprzednim LineGeometry przykładem. Składnia używana dla elementu PathGeometry jest o wiele bardziej szczegółowa niż używana w przypadku prostego LineGeometryelementu i może mieć większe znaczenie w użyciu LineGeometry klasy w tym przypadku, ale szczegółowa składnia PathGeometry pozwala na niezwykle skomplikowane i złożone regiony geometryczne.

Bardziej złożone geometrie można tworzyć przy użyciu kombinacji PathSegment obiektów.

W następnym przykładzie użyto elementu BezierSegment, a LineSegmenti , ArcSegment aby utworzyć kształt. Pierwszy przykład tworzy krzywą beziera sześcienną, definiując cztery punkty: punkt początkowy, który jest punktem końcowym poprzedniego segmentu, punktem końcowym (Point3) i dwoma punktami kontrolnymi (Point1 i Point2). Dwa punkty kontrolne krzywej Beziera sześciennego zachowują się jak magnesy, przyciągając części tego, co w przeciwnym razie byłoby prostą linią w kierunku siebie, tworząc krzywą. Pierwszy punkt kontrolny, Point1, wpływa na początkową część krzywej; drugi punkt kontrolny, Point2, wpływa na końcową część krzywej.

W przykładzie dodamy element LineSegment, który jest rysowany między punktem końcowym poprzedniego BezierSegment , który poprzedzał go do punktu określonego przez jego LineSegment właściwość.

W przykładzie dodamy element ArcSegment, który jest pobierany z punktu końcowego poprzedniego LineSegment do punktu określonego przez jego Point właściwość. W przykładzie określono również promień łuku x i y (Size), kąt obrotu (RotationAngle), flagę wskazującą, jak duży jest kąt wynikowego łuku (IsLargeArc) i wartość wskazującą kierunek rysowania łuku (SweepDirection). Poniższa ilustracja przedstawia kształt utworzony w tym przykładzie.

A PathGeometry with an arc.
ŚcieżkaGeometry

<Path Stroke="Black" StrokeThickness="1" >
  <Path.Data>
    <PathGeometry>
      <PathGeometry.Figures>
        <PathFigure StartPoint="10,50">
          <PathFigure.Segments>
            <BezierSegment
              Point1="100,0"
              Point2="200,200"
              Point3="300,100"/>
            <LineSegment Point="400,100" />
            <ArcSegment
              Size="50,50" RotationAngle="45"
              IsLargeArc="True" SweepDirection="Clockwise"
              Point="200,100"/>
          </PathFigure.Segments>
        </PathFigure>
      </PathGeometry.Figures>
    </PathGeometry>
  </Path.Data>
</Path>

// Create a figure.
PathFigure myPathFigure = new PathFigure();
myPathFigure.StartPoint = new Point(10,50);
myPathFigure.Segments.Add(
    new BezierSegment(
        new Point(100,0),
        new Point(200,200),
        new Point(300,100),
        true /* IsStroked */  ));
myPathFigure.Segments.Add(
    new LineSegment(
        new Point(400,100),
        true /* IsStroked */ ));
myPathFigure.Segments.Add(
    new ArcSegment(
        new Point(200,100),
        new Size(50,50),
        45,
        true, /* IsLargeArc */
        SweepDirection.Clockwise,
        true /* IsStroked */ ));

/// Create a PathGeometry to contain the figure.
PathGeometry myPathGeometry = new PathGeometry();
myPathGeometry.Figures.Add(myPathFigure);

// Display the PathGeometry.
Path myPath = new Path();
myPath.Stroke = Brushes.Black;
myPath.StrokeThickness = 1;
myPath.Data = myPathGeometry;

' Create a figure.
Dim myPathFigure As New PathFigure()
myPathFigure.StartPoint = New Point(10,50)
myPathFigure.Segments.Add(New BezierSegment(New Point(100,0), New Point(200,200), New Point(300,100), True)) ' IsStroked 
myPathFigure.Segments.Add(New LineSegment(New Point(400,100), True)) ' IsStroked 
myPathFigure.Segments.Add(New ArcSegment(New Point(200,100), New Size(50,50), 45, True, SweepDirection.Clockwise, True)) ' IsStroked  -  IsLargeArc 

''' Create a PathGeometry to contain the figure.
Dim myPathGeometry As New PathGeometry()
myPathGeometry.Figures.Add(myPathFigure)

' Display the PathGeometry. 
Dim myPath As New Path()
myPath.Stroke = Brushes.Black
myPath.StrokeThickness = 1
myPath.Data = myPathGeometry

Jeszcze bardziej złożone geometrie można utworzyć przy użyciu wielu PathFigure obiektów w obiekcie PathGeometry.

Poniższy przykład tworzy obiekt PathGeometry z dwoma PathFigure obiektami, z których każdy zawiera wiele PathSegment obiektów. Użyto PathFigure elementu z powyższego przykładu i elementu PathFigure z elementem i PolyLineSegmentQuadraticBezierSegment . Element A PolyLineSegment jest definiowany z tablicą punktów, a QuadraticBezierSegment element jest definiowany za pomocą punktu kontrolnego i punktu końcowego. Poniższa ilustracja przedstawia kształt utworzony w tym przykładzie.

A PathGeometry with an arc that includes two PathFigure objects.
PathGeometry z wieloma rysunkami

<Path Stroke="Black" StrokeThickness="1" >
  <Path.Data>
    <PathGeometry>
      <PathGeometry.Figures>
        <PathFigure StartPoint="10,50">
          <PathFigure.Segments>
            <BezierSegment
              Point1="100,0"
              Point2="200,200"
              Point3="300,100"/>
            <LineSegment Point="400,100" />
            <ArcSegment
              Size="50,50" RotationAngle="45"
              IsLargeArc="True" SweepDirection="Clockwise"
              Point="200,100"/>
          </PathFigure.Segments>
        </PathFigure>
        
        <PathFigure StartPoint="10,100">
          <PathFigure.Segments>
            <PolyLineSegment Points="50,100 50,150" />
            <QuadraticBezierSegment Point1="200,200" Point2="300,100"/>
          </PathFigure.Segments>
        </PathFigure>                
      </PathGeometry.Figures>
    </PathGeometry>
  </Path.Data>
</Path>

PathGeometry myPathGeometry = new PathGeometry();

// Create a figure.
PathFigure pathFigure1 = new PathFigure();
pathFigure1.StartPoint = new Point(10,50);
pathFigure1.Segments.Add(
    new BezierSegment(
        new Point(100,0),
        new Point(200,200),
        new Point(300,100),
        true /* IsStroked */ ));
pathFigure1.Segments.Add(
    new LineSegment(
        new Point(400,100),
        true /* IsStroked */ ));
pathFigure1.Segments.Add(
    new ArcSegment(
        new Point(200,100),
        new Size(50,50),
        45,
        true, /* IsLargeArc */
        SweepDirection.Clockwise,
        true /* IsStroked */ ));
myPathGeometry.Figures.Add(pathFigure1);

// Create another figure.
PathFigure pathFigure2 = new PathFigure();
pathFigure2.StartPoint = new Point(10,100);
Point[] polyLinePointArray =
    new Point[]{ new Point(50, 100), new Point(50, 150)};
PolyLineSegment myPolyLineSegment = new PolyLineSegment();
myPolyLineSegment.Points =
    new PointCollection(polyLinePointArray);
pathFigure2.Segments.Add(myPolyLineSegment);
pathFigure2.Segments.Add(
    new QuadraticBezierSegment(
        new Point(200,200),
        new Point(300,100),
        true /* IsStroked */ ));
myPathGeometry.Figures.Add(pathFigure2);

// Display the PathGeometry.
Path myPath = new Path();
myPath.Stroke = Brushes.Black;
myPath.StrokeThickness = 1;
myPath.Data = myPathGeometry;

Dim myPathGeometry As New PathGeometry()

' Create a figure.
Dim pathFigure1 As New PathFigure()
pathFigure1.StartPoint = New Point(10,50)
pathFigure1.Segments.Add(New BezierSegment(New Point(100,0), New Point(200,200), New Point(300,100), True)) ' IsStroked 
pathFigure1.Segments.Add(New LineSegment(New Point(400,100), True)) ' IsStroked 
pathFigure1.Segments.Add(New ArcSegment(New Point(200,100), New Size(50,50), 45, True, SweepDirection.Clockwise, True)) ' IsStroked  -  IsLargeArc 
myPathGeometry.Figures.Add(pathFigure1)

' Create another figure.
Dim pathFigure2 As New PathFigure()
pathFigure2.StartPoint = New Point(10,100)
Dim polyLinePointArray() As Point = { New Point(50, 100), New Point(50, 150)}
Dim myPolyLineSegment As New PolyLineSegment()
myPolyLineSegment.Points = New PointCollection(polyLinePointArray)
pathFigure2.Segments.Add(myPolyLineSegment)
pathFigure2.Segments.Add(New QuadraticBezierSegment(New Point(200,200), New Point(300,100), True)) ' IsStroked 
myPathGeometry.Figures.Add(pathFigure2)

' Display the PathGeometry. 
Dim myPath As New Path()
myPath.Stroke = Brushes.Black
myPath.StrokeThickness = 1
myPath.Data = myPathGeometry

StreamGeometry

PathGeometry Podobnie jak klasa, StreamGeometry definiuje złożony kształt geometryczny, który może zawierać krzywe, łuki i linie. PathGeometryW przeciwieństwie do elementu , zawartość obiektu StreamGeometry nie obsługuje powiązania danych, animacji ani modyfikacji. Użyj elementu StreamGeometry , jeśli musisz opisać złożoną geometrię, ale nie chcesz narzutować obsługi powiązania danych, animacji ani modyfikacji. Ze względu na jego wydajność klasa StreamGeometry jest dobrym wyborem do opisywania modułów adorujących.

Aby zapoznać się z przykładem, zobacz Create a Shape Using a StreamGeometry (Tworzenie kształtu przy użyciu elementu StreamGeometry).

Składni znacznikowania ścieżki

Typy PathGeometry i StreamGeometry obsługują składnię atrybutów Extensible Application Markup Language (XAML) przy użyciu specjalnej serii poleceń przenoszenia i rysowania. Aby uzyskać więcej informacji, zobacz Path Markup Syntax (Składnia znaczników ścieżki).

Geometrie złożone

Obiekty geometrii złożonej można utworzyć przy użyciu GeometryGroupmetody , a CombinedGeometrylub przez wywołanie metody Combinestatycznej Geometry .

  • Obiekt CombinedGeometry i Combine metoda wykonują operację logiczną, aby połączyć obszar zdefiniowany przez dwie geometrie. Geometry obiekty, które nie mają żadnego obszaru, są odrzucane. Można łączyć tylko dwa Geometry obiekty (chociaż te dwie geometrie mogą być również geometriami złożonymi).

  • Klasa GeometryGroup tworzy połączenie Geometry obiektów, które zawiera bez łączenia ich obszaru. Do obiektu można dodać dowolną GeometryGroupliczbę Geometry obiektów. Aby zapoznać się z przykładem, zobacz Tworzenie kształtu złożonego.

Ponieważ nie wykonują operacji łączenia, użycie GeometryGroup obiektów zapewnia korzyści z wydajności w związku z używaniem CombinedGeometry obiektów lub Combine metody.

Połączone geometrie

W poprzedniej sekcji wymieniono CombinedGeometry obiekt i Combine metodę łączenia obszaru zdefiniowanego przez geometrie, które zawierają. Wyliczenie GeometryCombineMode określa sposób łączenia geometrii. Możliwe wartości właściwości GeometryCombineMode to: Union, Intersect, Excludei Xor.

W poniższym przykładzie element CombinedGeometry jest definiowany z trybem łączenia unii. Oba Geometry1 i Geometry2 są zdefiniowane jako okręgi tego samego promienia, ale z centrami przesuniętymi o 50.

<Path Stroke="Black" StrokeThickness="1" Fill="#CCCCFF">
  <Path.Data>
    
    <!-- Combines two geometries using the union combine mode. -->
    <CombinedGeometry GeometryCombineMode="Union">
      <CombinedGeometry.Geometry1>
        <EllipseGeometry RadiusX="50" RadiusY="50" Center="75,75" />
      </CombinedGeometry.Geometry1>
      <CombinedGeometry.Geometry2>
        <EllipseGeometry RadiusX="50" RadiusY="50" Center="125,75" />
      </CombinedGeometry.Geometry2>
    </CombinedGeometry>
  </Path.Data>
</Path>

Results of the Union combine mode

W poniższym przykładzie element jest CombinedGeometry definiowany z trybem Xorłączenia . Oba Geometry1 i Geometry2 są zdefiniowane jako okręgi tego samego promienia, ale z centrami przesuniętymi o 50.

<Path Stroke="Black" StrokeThickness="1" Fill="#CCCCFF">
  <Path.Data>
    
    <!-- Combines two geometries using the XOR combine mode. -->
    <CombinedGeometry GeometryCombineMode="Xor">
      <CombinedGeometry.Geometry1>
        <EllipseGeometry RadiusX="50" RadiusY="50" Center="75,75" />
      </CombinedGeometry.Geometry1>
      <CombinedGeometry.Geometry2>
        <EllipseGeometry RadiusX="50" RadiusY="50" Center="125,75" />
      </CombinedGeometry.Geometry2>
    </CombinedGeometry>
  </Path.Data>
</Path>

Results of the Xor combine mode

Aby uzyskać dodatkowe przykłady, zobacz Tworzenie kształtu złożonego i Tworzenie połączonej geometrii.

Funkcje zamrażalne

Ponieważ dziedziczy ona z Freezable klasy, Geometry klasa zapewnia kilka specjalnych funkcji: Geometry obiekty można zadeklarować jako zasoby XAML, współdzielone między wieloma obiektami, wykonane tylko do odczytu w celu zwiększenia wydajności, sklonowania i zapewnienia bezpieczeństwa wątków. Aby uzyskać więcej informacji na temat różnych funkcji udostępnianych przez Freezable obiekty, zobacz Omówienie obiektów z możliwością zamrażania.

Inne funkcje geometrii

Klasa Geometry udostępnia również przydatne metody narzędziowe, takie jak:

Zobacz klasę, aby Geometry uzyskać pełną listę jej metod.

Zobacz też