Cenni preliminari sugli oggetti DrawingDrawing Objects Overview

In questo argomento vengono introdotti Drawing oggetti e viene descritto come utilizzarli per creare in modo efficiente forme, bitmap, testo e supporti.This topic introduces Drawing objects and describes how to use them to efficiently draw shapes, bitmaps, text, and media. Utilizzare Drawing oggetti quando si crea clipart, si disegna con una DrawingBrushoppure si utilizzano Visual oggetti.Use Drawing objects when you create clip art, paint with a DrawingBrush, or use Visual objects.

Definizione di oggetto DrawingWhat Is a Drawing Object?

Un oggetto Drawing descrive il contenuto visibile, ad esempio una forma, una bitmap, un video o una riga di testo.A Drawing object describes visible content, such as a shape, bitmap, video, or a line of text. Tipi diversi di disegni descrivono tipi diversi di contenuto.Different types of drawings describe different types of content. L'elenco seguente contiene i vari tipi di oggetti Drawing.The following is a list of the different types of drawing objects.

gli oggetti Drawing sono versatili; è possibile usare un oggetto Drawing in molti modi.Drawing objects are versatile; there are many ways you can use a Drawing object.

WPF fornisce altri tipi di oggetti che consentono di disegnare forme, bitmap, testo e contenuti multimediali.WPF provides other types of objects that are capable of drawing shapes, bitmaps, text, and media. Ad esempio, è anche possibile usare Shape oggetti per creare forme e il controllo MediaElement fornisce un altro modo per aggiungere video all'applicazione.For example, you can also use Shape objects to draw shapes, and the MediaElement control provides another way to add video to your application. Quando è necessario usare Drawing oggetti?So when should you use Drawing objects? Quando è possibile sacrificare le funzionalità a livello di Framework per ottenere vantaggi in termini di prestazioni o quando è necessario Freezable funzionalità.When you can sacrifice framework level features to gain performance benefits or when you need Freezable features. Poiché gli oggetti Drawing non supportano il layout, l'input e lo stato attivo, offrono vantaggi a livello di prestazioni che li rendono ideali per la descrizione di sfondi, ClipArt e per il disegno di basso livello con Visual oggetti.Because Drawing objects lack support for Layout, input, and focus, they provide performance benefits that make them ideal for describing backgrounds, clip art, and for low-level drawing with Visual objects.

Poiché si tratta di un tipo Freezable oggetto, Drawing oggetti ottengono diverse funzionalità speciali, tra cui le seguenti: possono essere dichiarate come risorse, condivise tra più oggetti, rese di sola lettura per migliorare le prestazioni, clonate e apportate thread-safe.Because they are a type Freezable object, Drawing objects gain several special features, which include the following: they can be declared as resources, shared among multiple objects, made read-only to improve performance, cloned, and made thread-safe. Per ulteriori informazioni sulle diverse funzionalità fornite dagli oggetti Freezable, vedere Cenni preliminari sugli oggetti Freezable.For more information about the different features provided by Freezable objects, see the Freezable Objects Overview.

Disegnare una formaDraw a Shape

Per disegnare una forma, utilizzare un GeometryDrawing.To draw a shape, you use a GeometryDrawing. La proprietà Geometry di un disegno Geometry descrive la forma da disegnare, la relativa proprietà Brush descrive il modo in cui deve essere disegnata l'area interna della forma e la relativa proprietà Pen descrive il modo in cui deve essere disegnata la struttura.A geometry drawing's Geometry property describes the shape to draw, its Brush property describes how the interior of the shape should be painted, and its Pen property describes how its outline should be drawn.

Nell'esempio seguente viene utilizzato un GeometryDrawing per disegnare una forma.The following example uses a GeometryDrawing to draw a shape. La forma è descritta da un GeometryGroup e due EllipseGeometry oggetti.The shape is described by a GeometryGroup and two EllipseGeometry objects. L'interno della forma viene disegnato con un LinearGradientBrush e il contorno viene disegnato con un PenBlack.The shape's interior is painted with a LinearGradientBrush and its outline is drawn with a Black Pen.

In questo esempio viene creata la GeometryDrawingseguente.This example creates the following GeometryDrawing.

Oggetto GeometryDrawing di due ellissiA GeometryDrawing of two ellipses
GeometryDrawingA GeometryDrawing

//
// Create the Geometry to draw.
//
GeometryGroup ellipses = new GeometryGroup();
ellipses.Children.Add(
    new EllipseGeometry(new Point(50,50), 45, 20)
    );
ellipses.Children.Add(
    new EllipseGeometry(new Point(50, 50), 20, 45)
    );

//
// Create a GeometryDrawing.
//
GeometryDrawing aGeometryDrawing = new GeometryDrawing();
aGeometryDrawing.Geometry = ellipses;

// Paint the drawing with a gradient.
aGeometryDrawing.Brush = 
    new LinearGradientBrush(
        Colors.Blue, 
        Color.FromRgb(204,204,255), 
        new Point(0,0), 
        new Point(1,1));

// Outline the drawing with a solid color.
aGeometryDrawing.Pen = new Pen(Brushes.Black, 10);
<GeometryDrawing>
  <GeometryDrawing.Geometry>

    <!-- Create a composite shape. -->
    <GeometryGroup>
      <EllipseGeometry Center="50,50" RadiusX="45" RadiusY="20" />
      <EllipseGeometry Center="50,50" RadiusX="20" RadiusY="45" />
    </GeometryGroup>
  </GeometryDrawing.Geometry>
  <GeometryDrawing.Brush>

    <!-- Paint the drawing with a gradient. -->
    <LinearGradientBrush>
      <GradientStop Offset="0.0" Color="Blue" />
      <GradientStop Offset="1.0" Color="#CCCCFF" />
    </LinearGradientBrush>
  </GeometryDrawing.Brush>
  <GeometryDrawing.Pen>

    <!-- Outline the drawing with a solid color. -->
    <Pen Thickness="10" Brush="Black" />
  </GeometryDrawing.Pen>
</GeometryDrawing>

Per un esempio completo, vedere Procedura: Creare un oggetto GeometryDrawing.For the complete example, see Create a GeometryDrawing.

Altre Geometry classi, ad esempio PathGeometry consentono di creare forme più complesse creando curve e archi.Other Geometry classes, such as PathGeometry enable you to create more complex shapes by creating curves and arcs. Per ulteriori informazioni sugli oggetti Geometry, vedere Cenni preliminari sulla geometria.For more information about Geometry objects, see the Geometry Overview.

Per ulteriori informazioni su altri modi per disegnare forme che non utilizzano oggetti Drawing, vedere Cenni preliminari sulle forme e il disegno di base in WPF.For more information about other ways to draw shapes that don't use Drawing objects, see Shapes and Basic Drawing in WPF Overview.

Disegnare un'immagineDraw an Image

Per creare un'immagine, usare un ImageDrawing.To draw an image, you use an ImageDrawing. La proprietà ImageSource di un oggetto ImageDrawing descrive l'immagine da disegnare e la relativa proprietà Rect definisce l'area in cui viene disegnata l'immagine.An ImageDrawing object's ImageSource property describes the image to draw, and its Rect property defines the region where the image is drawn.

L'esempio seguente disegna un'immagine in un rettangolo posizionata nel punto (75,75) vale a dire 100 x 100 pixel.The following example draws an image into a rectangle located at (75,75) that is 100 by 100 pixel. Nella figura seguente viene illustrato il ImageDrawing creato dall'esempio.The following illustration shows the ImageDrawing created by the example. È stato aggiunto un bordo grigio per visualizzare i limiti del ImageDrawing.A gray border was added to show the bounds of the ImageDrawing.

Oggetto ImageDrawing di 100 x 100 disegnato in corrispondenza di (75,75)A 100 by 100 ImageDrawing drawn at (75,75)
ImageDrawing di 100 per 100A 100 by 100 ImageDrawing

// Create a 100 by 100 image with an upper-left point of (75,75). 
ImageDrawing bigKiwi = new ImageDrawing();
bigKiwi.Rect = new Rect(75, 75, 100, 100);
bigKiwi.ImageSource = new BitmapImage(
    new Uri(@"sampleImages\kiwi.png", UriKind.Relative));
<!-- The Rect property specifies that the image only fill a 100 by 100
     rectangular area. -->
<ImageDrawing Rect="75,75,100,100" ImageSource="sampleImages\kiwi.png"/>

Per altre informazioni sulle immagini, vedere Cenni preliminari sulla creazione dell'immagine.For more information about images, see the Imaging Overview.

Riprodurre contenuti multimediali (solo codice)Play Media (Code Only)

Nota

Sebbene sia possibile dichiarare un VideoDrawing in Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML), è possibile caricare e riprodurre i supporti solo usando il codice.Although you can declare a VideoDrawing in Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML), you can only load and play its media using code. Per riprodurre video in Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML), usare invece una MediaElement.To play video in Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML), use a MediaElement instead.

Per riprodurre un file audio o video, usare un VideoDrawing e un MediaPlayer.To play an audio or video file, you use a VideoDrawing and a MediaPlayer. È possibile caricare e riprodurre contenuti multimediali in due modi diversi.There are two ways to load and play media. Il primo consiste nell'utilizzare una MediaPlayer e una VideoDrawing da soli e il secondo modo consiste nel creare MediaTimeline personalizzati da utilizzare con i MediaPlayer e VideoDrawing.The first is to use a MediaPlayer and a VideoDrawing by themselves, and the second way is to create your own MediaTimeline to use with the MediaPlayer and VideoDrawing.

Nota

Quando si distribuiscono contenuti multimediali con l'applicazione, non è possibile usare un file multimediale come risorsa di progetto, come avviene invece per un'immagine.When distributing media with your application, you cannot use a media file as a project resource, like you would an image. È necessario invece impostare il tipo di contenuto multimediale su Content nel file del progetto e CopyToOutputDirectory su PreserveNewest o su Always.In your project file, you must instead set the media type to Content and set CopyToOutputDirectory to PreserveNewest or Always.

Per riprodurre file multimediali senza creare MediaTimelinepersonalizzati, seguire questa procedura.To play media without creating your own MediaTimeline, you perform the following steps.

  1. Creare un oggetto MediaPlayer.Create a MediaPlayer object.

    MediaPlayer player = new MediaPlayer();
    
  2. Usare il metodo Open per caricare il file multimediale.Use the Open method to load the media file.

    player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
    
  3. Creare un oggetto VideoDrawing.Create a VideoDrawing.

    VideoDrawing aVideoDrawing = new VideoDrawing();
    
  4. Specificare le dimensioni e la posizione in cui creare i supporti impostando la proprietà Rect della VideoDrawing.Specify the size and location to draw the media by setting the Rect property of the VideoDrawing.

    aVideoDrawing.Rect = new Rect(0, 0, 100, 100);
    
  5. Impostare la proprietà Player della VideoDrawing con la MediaPlayer creata.Set the Player property of the VideoDrawing with the MediaPlayer you created.

    aVideoDrawing.Player = player;
    
  6. Usare il metodo Play della MediaPlayer per avviare la riproduzione del supporto.Use the Play method of the MediaPlayer to start playing the media.

    // Play the video once.
    player.Play();        
    

Nell'esempio seguente vengono usati una VideoDrawing e un MediaPlayer per riprodurre un file video una sola volta.The following example uses a VideoDrawing and a MediaPlayer to play a video file once.

//
// Create a VideoDrawing.
//      
MediaPlayer player = new MediaPlayer();

player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));

VideoDrawing aVideoDrawing = new VideoDrawing();

aVideoDrawing.Rect = new Rect(0, 0, 100, 100);

aVideoDrawing.Player = player;

// Play the video once.
player.Play();        

Per ottenere un controllo temporale aggiuntivo sui supporti, utilizzare una MediaTimeline con gli oggetti MediaPlayer e VideoDrawing.To gain additional timing control over the media, use a MediaTimeline with the MediaPlayer and VideoDrawing objects. Il MediaTimeline consente di specificare se il video deve essere ripetuto.The MediaTimeline enables you to specify whether the video should repeat. Per usare un MediaTimeline con una VideoDrawing, seguire questa procedura:To use a MediaTimeline with a VideoDrawing, you perform the following steps:

  1. Dichiarare il MediaTimeline e impostarne i comportamenti temporali.Declare the MediaTimeline and set its timing behaviors.

    // Create a MediaTimeline.
    MediaTimeline mTimeline = 
        new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative)); 
    
    // Set the timeline to repeat.
    mTimeline.RepeatBehavior = RepeatBehavior.Forever;
    
  2. Creare una MediaClock dalla MediaTimeline.Create a MediaClock from the MediaTimeline.

    // Create a clock from the MediaTimeline.
    MediaClock mClock = mTimeline.CreateClock();
    
  3. Creare una MediaPlayer e usare il MediaClock per impostare la relativa proprietà Clock.Create a MediaPlayer and use the MediaClock to set its Clock property.

    MediaPlayer repeatingVideoDrawingPlayer = new MediaPlayer();
    repeatingVideoDrawingPlayer.Clock = mClock;
    
  4. Creare una VideoDrawing e assegnare la MediaPlayer alla proprietà Player della VideoDrawing.Create a VideoDrawing and assign the MediaPlayer to the Player property of the VideoDrawing.

    VideoDrawing repeatingVideoDrawing = new VideoDrawing();
    repeatingVideoDrawing.Rect = new Rect(150, 0, 100, 100);
    repeatingVideoDrawing.Player = repeatingVideoDrawingPlayer;  
    

Nell'esempio seguente viene usato un MediaTimeline con una MediaPlayer e un VideoDrawing per riprodurre un video ripetutamente.The following example uses a MediaTimeline with a MediaPlayer and a VideoDrawing to play a video repeatedly.

//
// Create a VideoDrawing that repeats.
//

// Create a MediaTimeline.
MediaTimeline mTimeline = 
    new MediaTimeline(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative)); 

// Set the timeline to repeat.
mTimeline.RepeatBehavior = RepeatBehavior.Forever;

// Create a clock from the MediaTimeline.
MediaClock mClock = mTimeline.CreateClock();

MediaPlayer repeatingVideoDrawingPlayer = new MediaPlayer();
repeatingVideoDrawingPlayer.Clock = mClock;

VideoDrawing repeatingVideoDrawing = new VideoDrawing();
repeatingVideoDrawing.Rect = new Rect(150, 0, 100, 100);
repeatingVideoDrawing.Player = repeatingVideoDrawingPlayer;  

Si noti che, quando si usa un MediaTimeline, si usa il ClockController interattivo restituito dalla proprietà Controller della MediaClock per controllare la riproduzione dei supporti anziché i metodi interattivi di MediaPlayer.Note that, when you use a MediaTimeline, you use the interactive ClockController returned from the Controller property of the MediaClock to control media playback instead of the interactive methods of MediaPlayer.

Creare testoDraw Text

Per creare testo, usare un GlyphRunDrawing e un GlyphRun.To draw text, you use a GlyphRunDrawing and a GlyphRun. Nell'esempio seguente viene usato un GlyphRunDrawing per creare il testo "Hello World".The following example uses a GlyphRunDrawing to draw the text "Hello World".

GlyphRun theGlyphRun = new GlyphRun(
    new GlyphTypeface(new Uri(@"C:\WINDOWS\Fonts\TIMES.TTF")),
    0,
    false,
    13.333333333333334,
    new ushort[]{43, 72, 79, 79, 82, 3, 58, 82, 85, 79, 71},
    new Point(0, 12.29),
    new double[]{
        9.62666666666667, 7.41333333333333, 2.96, 
        2.96, 7.41333333333333, 3.70666666666667, 
        12.5866666666667, 7.41333333333333, 
        4.44, 2.96, 7.41333333333333},
    null,
    null,
    null,
    null,
    null,
    null

    );

GlyphRunDrawing gDrawing = new GlyphRunDrawing(Brushes.Black, theGlyphRun);
<GlyphRunDrawing ForegroundBrush="Black">
  <GlyphRunDrawing.GlyphRun>
    <GlyphRun 
      CaretStops="{x:Null}" 
      ClusterMap="{x:Null}" 
      IsSideways="False" 
      GlyphOffsets="{x:Null}" 
      GlyphIndices="43 72 79 79 82 3 58 82 85 79 71" 
      BaselineOrigin="0,12.29"  
      FontRenderingEmSize="13.333333333333334" 
      DeviceFontName="{x:Null}" 
      AdvanceWidths="9.62666666666667 7.41333333333333 2.96 2.96 7.41333333333333 3.70666666666667 12.5866666666667 7.41333333333333 4.44 2.96 7.41333333333333" 
      BidiLevel="0">
      <GlyphRun.GlyphTypeface>
        <GlyphTypeface FontUri="C:\WINDOWS\Fonts\TIMES.TTF" />
      </GlyphRun.GlyphTypeface>
    </GlyphRun>
  </GlyphRunDrawing.GlyphRun>
</GlyphRunDrawing>

Un GlyphRun è un oggetto di basso livello destinato all'uso con scenari di presentazione e stampa di documenti a formato fisso.A GlyphRun is a low-level object intended for use with fixed-format document presentation and print scenarios. Un modo più semplice per creare testo sullo schermo consiste nell'usare un Label o una TextBlock.A simpler way to draw text to the screen is to use a Label or a TextBlock. Per ulteriori informazioni su GlyphRun, vedere Introduzione all'oggetto GlyphRun e Cenni preliminari sull'elemento Glyphs.For more information about GlyphRun, see the Introduction to the GlyphRun Object and Glyphs Element overview.

Disegni compostiComposite Drawings

Un DrawingGroup consente di combinare più disegni in un unico disegno composto.A DrawingGroup enables you to combine multiple drawings into a single composite drawing. Utilizzando un DrawingGroupè possibile combinare forme, immagini e testo in un singolo oggetto Drawing.By using a DrawingGroup, you can combine shapes, images, and text into a single Drawing object.

Nell'esempio seguente viene utilizzato un DrawingGroup per combinare due oggetti GeometryDrawing e un oggetto ImageDrawing.The following example uses a DrawingGroup to combine two GeometryDrawing objects and an ImageDrawing object. Questo esempio produce il seguente output:This example produces the following output.

Oggetto DrawingGroup con più disegniA DrawingGroup with multiple drawings
Disegno compostoA composite drawing

//
// Create three drawings.
//
GeometryDrawing ellipseDrawing =
    new GeometryDrawing(
        new SolidColorBrush(Color.FromArgb(102, 181, 243, 20)),
        new Pen(Brushes.Black, 4),
        new EllipseGeometry(new Point(50,50), 50, 50)
    );

ImageDrawing kiwiPictureDrawing = 
    new ImageDrawing(
        new BitmapImage(new Uri(@"sampleImages\kiwi.png", UriKind.Relative)), 
        new Rect(50,50,100,100));

GeometryDrawing ellipseDrawing2 =
    new GeometryDrawing(
        new SolidColorBrush(Color.FromArgb(102,181,243,20)),
        new Pen(Brushes.Black, 4),
        new EllipseGeometry(new Point(150, 150), 50, 50)
    );

// Create a DrawingGroup to contain the drawings.
DrawingGroup aDrawingGroup = new DrawingGroup();
aDrawingGroup.Children.Add(ellipseDrawing);
aDrawingGroup.Children.Add(kiwiPictureDrawing);
aDrawingGroup.Children.Add(ellipseDrawing2);

<DrawingGroup>

  <GeometryDrawing Brush="#66B5F314">
    <GeometryDrawing.Geometry>
      <EllipseGeometry Center="50,50" RadiusX="50"  RadiusY="50"/>
    </GeometryDrawing.Geometry>
    <GeometryDrawing.Pen>
      <Pen Brush="Black" Thickness="4" />
    </GeometryDrawing.Pen>
  </GeometryDrawing>
  <ImageDrawing ImageSource="sampleImages\kiwi.png" Rect="50,50,100,100"/>
  <GeometryDrawing Brush="#66B5F314">
    <GeometryDrawing.Geometry>
      <EllipseGeometry Center="150,150" RadiusX="50"  RadiusY="50"/>
    </GeometryDrawing.Geometry>
    <GeometryDrawing.Pen>
      <Pen Brush="Black" Thickness="4" />
    </GeometryDrawing.Pen>
  </GeometryDrawing>
</DrawingGroup>

Un DrawingGroup consente inoltre di applicare maschere di opacità, trasformazioni, effetti bitmap e altre operazioni al relativo contenuto.A DrawingGroup also enables you to apply opacity masks, transforms, bitmap effects, and other operations to its contents. DrawingGroup operazioni vengono applicate nell'ordine seguente: OpacityMask, Opacity, BitmapEffect, ClipGeometry, GuidelineSet, quindi Transform.DrawingGroup operations are applied in the following order: OpacityMask, Opacity, BitmapEffect, ClipGeometry, GuidelineSet, and then Transform.

Nella figura seguente viene illustrato l'ordine in cui vengono applicate DrawingGroup operazioni.The following illustration shows the order in which DrawingGroup operations are applied.

Ordine delle operazioni DrawingGroupDrawingGroup order of operations
Ordine delle operazioni DrawingGroupOrder of DrawingGroup operations

Nella tabella seguente vengono descritte le proprietà che è possibile utilizzare per modificare il contenuto di un oggetto DrawingGroup.The following table describes the properties you can use to manipulate a DrawingGroup object's contents.

proprietàProperty DescrizioneDescription IllustrazioneIllustration
OpacityMask Modifica l'opacità delle parti selezionate del contenuto del DrawingGroup.Alters the opacity of selected portions of the DrawingGroup contents. Per un esempio, vedere Procedura: Controllare l'opacità di un disegno.For an example, see How to: Control the Opacity of a Drawing. Oggetto DrawingGroup con maschera di opacitàA DrawingGroup with an opacity mask
Opacity Modifica in modo uniforme l'opacità del contenuto del DrawingGroup.Uniformly changes the opacity of the DrawingGroup contents. Utilizzare questa proprietà per rendere trasparente o parzialmente trasparente un Drawing.Use this property to make a Drawing transparent or partially transparent. Per un esempio, vedere How to: Apply an Opacity Mask to a Drawing (Procedura: Applicare una maschera di opacità a un disegno).For an example, see How to: Apply an Opacity Mask to a Drawing. DrawingGroup con impostazioni di opacità diverseDrawingGroups with different opacity settings
BitmapEffect Applica una BitmapEffect al contenuto del DrawingGroup.Applies a BitmapEffect to the DrawingGroup contents. Per un esempio, vedere Procedura: Applicare un BitmapEffect a un disegno.For an example, see How to: Apply a BitmapEffect to a Drawing. DrawingGroup con BlurBitmapEffectDrawingGroup with a BlurBitmapEffect
ClipGeometry Consente di ritagliare il contenuto del DrawingGroup in un'area descritta utilizzando una Geometry.Clips the DrawingGroup contents to a region you describe using a Geometry. Per un esempio, vedere Procedura: Ritagliare un disegno.For an example, see How to: Clip a Drawing . DrawingGroup con un'area di ritaglio definitaDrawingGroup with a defined clip region
GuidelineSet Consente di bloccare i pixel indipendenti del dispositivo ai pixel del dispositivo lungo linee guida specificate.Snaps device independent pixels to device pixels along the specified guidelines. Questa proprietà è utile per garantire che il rendering degli elementi grafici dettagliati venga eseguito con precisione su schermi a DPI basso.This property is useful for ensuring that finely detailed graphics render sharply on low-DPI displays. Per un esempio, vedere Procedura: Applicare un GuidelineSet a un disegno.For an example, see Apply a GuidelineSet to a Drawing. Oggetto DrawingGroup con e senza un insieme di istruzioniA DrawingGroup with and without a GuidelineSet
Transform Trasforma il contenuto del DrawingGroup.Transforms the DrawingGroup contents. Per un esempio, vedere How to: Apply a Transform to a Drawing (Procedura: Applicare una trasformazione a un disegno).For an example, see How to: Apply a Transform to a Drawing. Oggetto DrawingGroup ruotatoA rotated DrawingGroup

Visualizzare un disegno come immagineDisplay a Drawing as an Image

Per visualizzare un Drawing con un controllo Image, utilizzare un DrawingImage come Source del controllo Image e impostare la proprietà DrawingImage dell'oggetto DrawingImage.Drawing sul disegno da visualizzare.To display a Drawing with an Image control, use a DrawingImage as the Image control's Source and set the DrawingImage object's DrawingImage.Drawing property to the drawing you want to display.

Nell'esempio seguente vengono utilizzati un DrawingImage e un controllo Image per visualizzare un GeometryDrawing.The following example uses a DrawingImage and an Image control to display a GeometryDrawing. Questo esempio produce il seguente output:This example produces the following output.

Oggetto GeometryDrawing di due ellissiA GeometryDrawing of two ellipses
Oggetto DrawingImageA DrawingImage

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SDKSample
{
    public class DrawingImageExample : Page
    {

        public DrawingImageExample()
        {

            //
            // Create the Geometry to draw.
            //
            GeometryGroup ellipses = new GeometryGroup();
            ellipses.Children.Add(
                new EllipseGeometry(new Point(50,50), 45, 20)
                );
            ellipses.Children.Add(
                new EllipseGeometry(new Point(50, 50), 20, 45)
                );

            //
            // Create a GeometryDrawing.
            //
            GeometryDrawing aGeometryDrawing = new GeometryDrawing();
            aGeometryDrawing.Geometry = ellipses;

            // Paint the drawing with a gradient.
            aGeometryDrawing.Brush = 
                new LinearGradientBrush(
                    Colors.Blue, 
                    Color.FromRgb(204,204,255), 
                    new Point(0,0), 
                    new Point(1,1));

            // Outline the drawing with a solid color.
            aGeometryDrawing.Pen = new Pen(Brushes.Black, 10);

            //
            // Use a DrawingImage and an Image control
            // to display the drawing.
            //
            DrawingImage geometryImage = new DrawingImage(aGeometryDrawing);

            // Freeze the DrawingImage for performance benefits.
            geometryImage.Freeze();

            Image anImage = new Image();
            anImage.Source = geometryImage;
            anImage.HorizontalAlignment = HorizontalAlignment.Left;

            //
            // Place the image inside a border and
            // add it to the page.
            //
            Border exampleBorder = new Border();
            exampleBorder.Child = anImage;
            exampleBorder.BorderBrush = Brushes.Gray;
            exampleBorder.BorderThickness = new Thickness(1);
            exampleBorder.HorizontalAlignment = HorizontalAlignment.Left;
            exampleBorder.VerticalAlignment = VerticalAlignment.Top;
            exampleBorder.Margin = new Thickness(10);

            this.Margin = new Thickness(20);
            this.Background = Brushes.White;
            this.Content = exampleBorder;
        }

    }
}
<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="PresentationOptions"
  Background="White" Margin="20">

  <Border BorderBrush="Gray" BorderThickness="1" 
    HorizontalAlignment="Left" VerticalAlignment="Top"
    Margin="10">

    <!-- This image uses a Drawing object for its source. -->
    <Image>
      <Image.Source>
        <DrawingImage PresentationOptions:Freeze="True">
          <DrawingImage.Drawing>
            <GeometryDrawing>
              <GeometryDrawing.Geometry>
                <GeometryGroup>
                  <EllipseGeometry Center="50,50" RadiusX="45" RadiusY="20" />
                  <EllipseGeometry Center="50,50" RadiusX="20" RadiusY="45" />
                </GeometryGroup>
              </GeometryDrawing.Geometry>
              <GeometryDrawing.Brush>
                <LinearGradientBrush>
                  <GradientStop Offset="0.0" Color="Blue" />
                  <GradientStop Offset="1.0" Color="#CCCCFF" />
                </LinearGradientBrush>
              </GeometryDrawing.Brush>
              <GeometryDrawing.Pen>
                <Pen Thickness="10" Brush="Black" />
              </GeometryDrawing.Pen>
            </GeometryDrawing>
          </DrawingImage.Drawing>
        </DrawingImage>
      </Image.Source>
    </Image>
  </Border>

</Page>

Disegnare un oggetto con un oggettoPaint an Object with a Drawing

Un DrawingBrush è un tipo di pennello che disegna un'area con un oggetto Drawing.A DrawingBrush is a type of brush that paints an area with a drawing object. Può essere usato per disegnare quasi tutti gli oggetti grafici con un oggetto Drawing.You can use it to paint just about any graphical object with a drawing. La proprietà Drawing di un DrawingBrush ne descrive il Drawing.The Drawing property of a DrawingBrush describes its Drawing. Per eseguire il rendering di un Drawing con un DrawingBrush, aggiungerlo al pennello utilizzando la proprietà Drawing del pennello e utilizzare il pennello per disegnare un oggetto grafico, ad esempio un controllo o un pannello.To render a Drawing with a DrawingBrush, add it to the brush using the brush's Drawing property and use the brush to paint a graphical object, such as a control or panel.

Negli esempi seguenti viene usato un DrawingBrush per disegnare il Fill di un Rectangle con un modello creato da un GeometryDrawing.The following examples uses a DrawingBrush to paint the Fill of a Rectangle with a pattern created from a GeometryDrawing. Questo esempio produce il seguente output:This example produces the following output.

Oggetto DrawingBrush affiancatoA tiled DrawingBrush
Oggetto GeometryDrawing usato con un oggetto DrawingBrushA GeometryDrawing used with a DrawingBrush

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SDKSample
{
    public class DrawingBrushExample : Page
    {

        public DrawingBrushExample()
        {

            //
            // Create the Geometry to draw.
            //
            GeometryGroup ellipses = new GeometryGroup();
            ellipses.Children.Add(
                new EllipseGeometry(new Point(50,50), 45, 20)
                );
            ellipses.Children.Add(
                new EllipseGeometry(new Point(50, 50), 20, 45)
                );
                
            //
            // Create a GeometryDrawing.
            //
            GeometryDrawing aGeometryDrawing = new GeometryDrawing();
            aGeometryDrawing.Geometry = ellipses;

            // Paint the drawing with a gradient.
            aGeometryDrawing.Brush = 
                new LinearGradientBrush(
                    Colors.Blue, 
                    Color.FromRgb(204,204,255), 
                    new Point(0,0), 
                    new Point(1,1));

            // Outline the drawing with a solid color.
            aGeometryDrawing.Pen = new Pen(Brushes.Black, 10);

            DrawingBrush patternBrush = new DrawingBrush(aGeometryDrawing);
            patternBrush.Viewport = new Rect(0, 0, 0.25, 0.25);
            patternBrush.TileMode = TileMode.Tile;
            patternBrush.Freeze();

            //
            // Create an object to paint.
            //
            Rectangle paintedRectangle = new Rectangle();
            paintedRectangle.Width = 100;
            paintedRectangle.Height = 100;
            paintedRectangle.Fill = patternBrush;

            //
            // Place the image inside a border and
            // add it to the page.
            //
            Border exampleBorder = new Border();
            exampleBorder.Child = paintedRectangle;
            exampleBorder.BorderBrush = Brushes.Gray;
            exampleBorder.BorderThickness = new Thickness(1);
            exampleBorder.HorizontalAlignment = HorizontalAlignment.Left;
            exampleBorder.VerticalAlignment = VerticalAlignment.Top;
            exampleBorder.Margin = new Thickness(10);

            this.Margin = new Thickness(20);
            this.Background = Brushes.White;
            this.Content = exampleBorder;
        }
    }
}
<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  mc:Ignorable="PresentationOptions"
  Margin="20" Background="White">

  <Border BorderBrush="Gray" BorderThickness="1" 
    HorizontalAlignment="Left" VerticalAlignment="Top"
    Margin="10">
    <Rectangle Width="100" Height="100">
      <Rectangle.Fill>
        <DrawingBrush PresentationOptions:Freeze="True"
                      Viewport="0,0,0.25,0.25" TileMode="Tile">
          <DrawingBrush.Drawing>
            <GeometryDrawing>
              <GeometryDrawing.Geometry>
                <GeometryGroup>
                  <EllipseGeometry Center="50,50" RadiusX="45" RadiusY="20" />
                  <EllipseGeometry Center="50,50" RadiusX="20" RadiusY="45" />
                </GeometryGroup>
              </GeometryDrawing.Geometry>
              <GeometryDrawing.Brush>
                <LinearGradientBrush>
                  <GradientStop Offset="0.0" Color="Blue" />
                  <GradientStop Offset="1.0" Color="#CCCCFF" />
                </LinearGradientBrush>
              </GeometryDrawing.Brush>
              <GeometryDrawing.Pen>
                <Pen Thickness="10" Brush="Black" />
              </GeometryDrawing.Pen>
            </GeometryDrawing>
          </DrawingBrush.Drawing>
        </DrawingBrush>
      </Rectangle.Fill>

    </Rectangle>
  </Border>


</Page>

La classe DrawingBrush offre un'ampia gamma di opzioni per l'estensione e l'affiancamento del contenuto.The DrawingBrush class provides a variety of options for stretching and tiling its content. Per ulteriori informazioni su DrawingBrush, vedere Cenni preliminari sul disegno con immagini, disegni e oggetti visivi .For more information about DrawingBrush, see the Painting with Images, Drawings, and Visuals overview.

Eseguire il rendering di un disegno con un oggetto VisualRender a Drawing with a Visual

Un DrawingVisual è un tipo di oggetto visivo progettato per eseguire il rendering di un disegno.A DrawingVisual is a type of visual object designed to render a drawing. Lavorare direttamente a livello visivo è un'opportunità per gli sviluppatori che desiderano creare un ambiente grafico altamente personalizzato, ma questo argomento non viene descritto in questa panoramica.Working directly at the visual layer is an option for developers who want to build a highly customized graphical environment, and is not described in this overview. Per altre informazioni, vedere Utilizzo degli oggetti DrawingVisual.For more information, see the Using DrawingVisual Objects overview.

Oggetti DrawingContextDrawingContext Objects

La classe DrawingContext consente di popolare una Visual o una Drawing con contenuto visivo.The DrawingContext class enables you to populate a Visual or a Drawing with visual content. Molti di questi oggetti grafici di basso livello usano un DrawingContext perché descrivono contenuti grafici in modo molto efficiente.Many such lower-level graphics objects use a DrawingContext because it describes graphical content very efficiently.

Sebbene i DrawingContext metodi di richiamo siano simili ai metodi di estrazione del tipo di System.Drawing.Graphics, sono in realtà molto diversi.Although the DrawingContext draw methods appear similar to the draw methods of the System.Drawing.Graphics type, they are actually very different. DrawingContext viene usato con un sistema grafico in modalità mantenuta, mentre il tipo di System.Drawing.Graphics viene usato con un sistema di grafica in modalità immediata.DrawingContext is used with a retained mode graphics system, while the System.Drawing.Graphics type is used with an immediate mode graphics system. Quando si usano i comandi di progetto di un oggetto DrawingContext, si archivia effettivamente un set di istruzioni per il rendering (sebbene il meccanismo di archiviazione esatto dipenda dal tipo di oggetto che fornisce la DrawingContext) che verrà usato successivamente dal sistema grafico; non si sta disegnando sullo schermo in tempo reale.When you use a DrawingContext object's draw commands, you are actually storing a set of rendering instructions (although the exact storage mechanism depends on the type of object that supplies the DrawingContext) that will later be used by the graphics system; you are not drawing to the screen in real-time. Per ulteriori informazioni sul funzionamento del sistema grafico Windows Presentation Foundation (WPF), vedere Cenni preliminari sul rendering della grafica WPF.For more information about how the Windows Presentation Foundation (WPF) graphics system works, see the WPF Graphics Rendering Overview.

Non è mai possibile creare direttamente un'istanza di un DrawingContext; è tuttavia possibile acquisire un contesto di disegno da determinati metodi, ad esempio DrawingGroup.Open e DrawingVisual.RenderOpen.You never directly instantiate a DrawingContext; you can, however, acquire a drawing context from certain methods, such as DrawingGroup.Open and DrawingVisual.RenderOpen.

Enumerare il contenuto di un oggetto VisualEnumerate the Contents of a Visual

Oltre agli altri utilizzi, Drawing oggetti forniscono anche un modello a oggetti per l'enumerazione del contenuto di un Visual.In addition to their other uses, Drawing objects also provide an object model for enumerating the contents of a Visual.

Nell'esempio seguente viene usato il metodo GetDrawing per recuperare il valore DrawingGroup di un Visual ed enumerarlo.The following example uses the GetDrawing method to retrieve the DrawingGroup value of a Visual and enumerate it.

public void RetrieveDrawing(Visual v)
{
    DrawingGroup drawingGroup = VisualTreeHelper.GetDrawing(v);
    EnumDrawingGroup(drawingGroup);
}

// Enumerate the drawings in the DrawingGroup.
public void EnumDrawingGroup(DrawingGroup drawingGroup)
{
    DrawingCollection dc = drawingGroup.Children;

    // Enumerate the drawings in the DrawingCollection.
    foreach (Drawing drawing in dc)
    {
        // If the drawing is a DrawingGroup, call the function recursively.
        if (drawing is DrawingGroup group)
        {
            EnumDrawingGroup(group);
        }
        else if (drawing is GeometryDrawing)
        {
            // Perform action based on drawing type.  
        }
        else if (drawing is ImageDrawing)
        {
            // Perform action based on drawing type.
        }
        else if (drawing is GlyphRunDrawing)
        {
            // Perform action based on drawing type.
        }
        else if (drawing is VideoDrawing)
        {
            // Perform action based on drawing type.
        }
    }
}

Vedere ancheSee also