Udostępnij za pośrednictwem


Geometria — omówienie

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

Co to jest geometria?

Klasa Geometry i klasy pochodzące z niej, takie jak EllipseGeometry, PathGeometryi CombinedGeometry, umożliwiają opisanie geometrii kształtu 2D. Te opisy geometrii mają wiele zastosowań, takich jak definiowanie kształtu do rysowania na ekranie lub definiowanie obszarów testowania kolizji i przycięcia. 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 klas PathGeometry i StreamGeometry, które umożliwiają opisywanie łuków i krzywych.

Ponieważ Geometry jest typem Freezable, obiekty Geometry oferują kilka specjalnych możliwości: mogą być zadeklarowane jako zasoby , współużytkowane między wieloma obiektami, ustawione jako tylko do odczytu w celu zwiększenia wydajności, sklonowane i bezpieczne wątkowo. Aby uzyskać więcej informacji o różnych funkcjach udostępnianych przez obiekty Freezable, zobacz Obiekty zamrażalne — omówienie.

Geometrie a kształty

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

Dla jednego klasa Geometry dziedziczy z klasy Freezable, podczas gdy klasa Shape dziedziczy z FrameworkElement. Ponieważ Shape obiekty są elementami, mogą renderować i uczestniczyć w systemie rozmieszczenia, podczas gdy Geometry obiekty nie mogą.

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

Kształt ścieżki

Jedna Shape, klasa Path, używa Geometry do opisania jego zawartości. Ustawiając właściwość Data elementu Path przy użyciu Geometry oraz ustawiając jego właściwości Fill i Stroke, można wyświetlić Geometry.

Typowe właściwości dotyczące geometrii

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ą obiekt Geometry.

Typ Własność
DoubleAnimationUsingPath PathGeometry
DrawingGroup ClipGeometry
GeometryDrawing Geometry
Path Data
UIElement Clip

Proste typy geometrii

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

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

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

  • RectangleGeometry jest definiowana przez strukturę Rect, która określa jej położenie względne oraz wysokość i szerokość. Prostokąt zaokrąglony można utworzyć, ustawiając właściwości RadiusX i RadiusY.

  • EllipseGeometry jest definiowana 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 PathGeometry lub łącząc obiekty geometryczne ze sobą, ale te klasy zapewniają prostsze sposoby tworzenia tych podstawowych kształtów geometrycznych.

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

GeometriaLinii
Geometria linii narysowana od (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ć EllipseGeometry. Przykłady ustawiają Center dla EllipseGeometry na punkt 50,50, a promień x i promień y są ustawione na 50, co powoduje utworzenie okręgu o średnicy 100. Wnętrze elipsy 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 narysowany na (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ć RectangleGeometry. Położenie i wymiary prostokąta są definiowane przez strukturę Rect. Pozycja jest 50,50, a wysokość i szerokość są 25, co tworzy kwadrat. Poniższa ilustracja przedstawia dane wyjściowe z przykładu.

prostokątaGeometry
GeometryaProstokatna narysowana na 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 jako obszaru przycięcia dla obrazu. Obiekt Image jest zdefiniowany z Width 200 i Height 150. EllipseGeometry z wartością RadiusX 100, wartością RadiusY 75, a z wartością Center 100,75 jest przypisana do właściwości Clip obrazu. Zostanie wyświetlona tylko część obrazu znajdującego się w obszarze wielokropka. Poniższa ilustracja przedstawia dane wyjściowe z przykładu.

obraz z wycinaniem i bez wycinania
GeometriaElipsy używana do przycinania kontroli obrazu

<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, klasa StreamGeometry, zapewniają środki do opisywania wielu złożonych postaci składających się z łuków, krzywych i linii.

W sercu PathGeometry jest kolekcja obiektów PathFigure, tak nazwanych, ponieważ każda figura przedstawia dyskretny kształt w PathGeometry. Każda PathFigure składa się z co najmniej jednego obiektu PathSegment, z których każdy opisuje segment figury.

Istnieje wiele typów segmentów.

Typ segmentu Opis Przykład
ArcSegment Tworzy eliptyczny łuk między dwoma punktami. Utwórz łuk eliptyczny.
BezierSegment Tworzy krzywą beziera sześcienną między dwoma punktami. utwórz krzywą Béziera sześcienną.
LineSegment Tworzy linię między dwoma punktami. Utwórz element LineSegment w PathGeometry
PolyBezierSegment Tworzy serię sześciennych krzywych Beziera. Zobacz stronę typu PolyBezierSegment.
PolyLineSegment Tworzy serię wierszy. Zobacz stronę typu PolyLineSegment.
PolyQuadraticBezierSegment Tworzy serię krzywych Beziera kwadratowego. Zobacz stronę PolyQuadraticBezierSegment.
QuadraticBezierSegment Tworzy krzywą Beziera kwadratowego. Utwórz krzywą kwadratową Béziera.

Segmenty w obrębie 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 elementu PathFigure określa punkt, z którego rysowany jest pierwszy segment. Każdy kolejny segment rozpoczyna się od punktu końcowego poprzedniego segmentu. Na przykład można zdefiniować pionową linię z 10,50 do 10,150, ustawiając właściwość StartPoint na 10,50 i tworząc LineSegment z ustawieniem właściwości Point10,150.

Poniższy przykład tworzy prostą PathGeometry składającą się z jednego PathFigure z LineSegment i wyświetla ją przy użyciu elementu Path. StartPoint obiektu PathFigure jest ustawione na 10,20, a LineSegment jest definiowane z punktem końcowym 100,130. Na poniższej ilustracji przedstawiono PathGeometry utworzone przez ten przykład.

LineGeometry
PathGeometry, który zawiera pojedynczy segment linii

<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 przykładem LineGeometry. Składnia używana dla PathGeometry jest znacznie bardziej szczegółowa niż ta używana w przypadku prostego LineGeometryi może mieć większy sens użycie klasy LineGeometry w tym przypadku, ale rozbudowana 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 obiektów PathSegment.

W następnym przykładzie użyto BezierSegment, LineSegmenti ArcSegment do utworzenia kształtu. 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.

Następnie przykład dodaje LineSegment, który jest rysowany między punktem końcowym poprzedniego BezierSegment a punktem określonym przez właściwość LineSegment.

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

Geometria ścieżki z łukiem.
Geometria ścieżki

<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 tworzyć przy użyciu wielu obiektów PathFigure w PathGeometry.

Poniższy przykład tworzy PathGeometry z dwoma obiektami PathFigure, z których każdy zawiera wiele obiektów PathSegment. Używane są PathFigure z powyższego przykładu oraz PathFigure w połączeniu z PolyLineSegment i QuadraticBezierSegment. PolyLineSegment jest definiowana z tablicą punktów, a QuadraticBezierSegment jest definiowana z punktem kontrolnym i punktem końcowym. Poniższa ilustracja przedstawia kształt utworzony w tym przykładzie.

A PathGeometry z łukiem zawierającym dwa obiekty PathFigure.
PathGeometry z wieloma figurami

<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

Podobnie jak klasa PathGeometry, StreamGeometry definiuje złożony kształt geometryczny, który może zawierać krzywe, łuki i linie. W przeciwieństwie do PathGeometryzawartość StreamGeometry nie obsługuje powiązania danych, animacji ani modyfikacji. Użyj StreamGeometry, jeśli musisz opisać złożoną geometrię, ale nie chcesz mieć dodatkowego obciążenia wynikającego z obsługi powiązania danych, animacji ani modyfikacji. Ze względu na jego wydajność klasa StreamGeometry jest dobrym wyborem do opisywania adornerów.

Aby zapoznać się z przykładem, zobacz Tworzenie kształtu przy użyciu elementu StreamGeometry.

Składnia znaczników ś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.

Geometrie złożone

Obiekty geometrii złożonej można tworzyć przy użyciu GeometryGroup, CombinedGeometrylub wywołując metodę statyczną GeometryCombine.

Ponieważ nie wykonują operacji łączenia, użycie obiektów GeometryGroup zapewnia korzyści w zakresie wydajności w przypadku używania obiektów CombinedGeometry lub metody Combine.

Połączone geometrie

W poprzedniej sekcji wymieniono obiekt CombinedGeometry i metodę Combine łączącą obszar zdefiniowany 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 CombinedGeometry definiowane jest z trybem łączenia Union. Zarówno Geometry1, jak 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>

wyniki trybu łączenia unii

W poniższym przykładzie CombinedGeometry jest definiowana z trybem łączenia Xor. Zarówno Geometry1, jak 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>

Wyniki trybu łączenia metodą XOR

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

Funkcje zamrażalne

Ponieważ dziedziczy ona z klasy Freezable, klasa Geometry udostępnia kilka specjalnych funkcji: Geometry obiekty można zadeklarować jako zasoby XAML, współużytkowane 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 o różnych funkcjach udostępnianych przez obiekty Freezable, zobacz Obiekty zamrażalne — omówienie.

Inne funkcje geometrii

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

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

Zobacz też