Condividi tramite


Cenni preliminari sugli oggetti Drawing

In questo argomento viene fornita un'introduzione agli oggetti Drawing e ne viene descritto l'utilizzo per creare forme, bitmap, testo e contenuti multimediali in modo efficace. Utilizzare gli oggetti Drawing quando si creano ClipArt, si disegna con DrawingBrush o si utilizzano oggetti Visual.

Nel presente argomento sono contenute le seguenti sezioni.

  • Definizione di oggetto Drawing
  • Disegnare una forma
  • Disegnare un'immagine
  • Riprodurre contenuti multimediali (Solo codice)
  • Creare testo
  • Disegni composti
  • Visualizzare un disegno come immagine
  • Disegnare un oggetto con un oggetto Drawing
  • Rendering di un disegno con un oggetto Visual
  • Oggetti DrawingContext
  • Enumerare il contenuto di un oggetto Visual
  • Argomenti correlati

Definizione di oggetto Drawing

Un oggetto Drawing descrive il contenuto visibile, ad esempio una forma, una bitmap, un video o una riga di testo. Tipi diversi di disegni descrivono tipi diversi di contenuto. Di seguito viene fornito un elenco dei diversi tipi di oggetti Drawing.

  • GeometryDrawing - Consente di disegnare una forma.

  • ImageDrawing - Consente di disegnare un'immagine.

  • GlyphRunDrawing - Consente di creare del testo.

  • VideoDrawing - Consente di riprodurre un file audio o video.

  • DrawingGroup - Consente di eseguire altri disegni. Utilizzare un gruppo di disegni per combinare altri disegni in un unico disegno composto.

Gli oggetti Drawing sono versatili. Sono molti i modi in cui è possibile utilizzare un oggetto Drawing.

  • Può essere visualizzato come immagine utilizzando un oggetto DrawingImage e un controllo Image.

  • Può essere utilizzato con un oggetto DrawingBrush per disegnare un oggetto come l'oggetto Background di Page.

  • Può essere utilizzato per descrivere l'aspetto di un oggetto DrawingVisual.

  • Può essere utilizzato per enumerare il contenuto di un oggetto Visual.

WPF fornisce altri tipi di oggetti che consentono di disegnare forme, bitmap, testo e contenuti multimediali. Ad esempio, è anche possibile utilizzare gli oggetti Shape per disegnare forme e il controllo MediaElement fornisce un altro modo di aggiungere video all'applicazione. Pertanto, quando è necessario utilizzare gli oggetti Drawing? Quando è possibile sacrificare le funzionalità a livello framework per ottenere vantaggi in termini di prestazioni o quando sono necessarie funzionalità Freezable. Poiché gli oggetti Drawing mancano del supporto per Sistema di layout, l'input e lo stato attivo, forniscono vantaggi in termini di prestazioni che li rendono ideali per descrivere sfondi, ClipArt e il disegno di basso livello con gli oggetti Visual.

Poiché si tratta di un tipo di oggetto Freezable, gli oggetti Drawing acquisiscono molte funzionalità speciali, ad esempio possono essere dichiarati come risorse, condivisi tra più oggetti, resi disponibili in sola lettura per migliorare le prestazioni, duplicati, nonché resi thread-safe. Per ulteriori informazioni sulle diverse funzionalità disponibili per gli oggetti Freezable, vedere Cenni preliminari sugli oggetti Freezable.

Disegnare una forma

Per disegnare una forma si utilizza GeometryDrawing. La proprietà Geometry del disegno della geometria descrive la forma da disegnare, la proprietà Brush descrive il modo in cui deve essere disegnato l'interno della forma e la proprietà Pen descrive il modo in cui tracciarne il contorno.

Nell'esempio riportato di seguito viene utilizzato GeometryDrawing per disegnare una forma. La forma è descritta da un oggetto GeometryGroup e due oggetti EllipseGeometry. L'interno della forma viene disegnato con LinearGradientBrush e il contorno con Black Pen.

Nell'esempio riportato di seguito viene creato il seguente oggetto GeometryDrawing.

Un oggetto GeometryDrawing

GeometryDrawing di due ellissi

//
// 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 l'esempio completo, vedere Procedura: creare un oggetto GeometryDrawing.

Altre classi Geometry, come PathGeometry, consentono di creare forme più complesse, quali curve e archi. Per ulteriori informazioni sugli oggetti Geometry, vedere Cenni preliminari sulle classi Geometry.

Per ulteriori informazioni sugli altri modi di disegnare forme che non utilizzino gli oggetti Drawing, vedere Cenni preliminari sugli oggetti Shape e sulle funzionalità di disegno di base di WPF.

Disegnare un'immagine

Per disegnare un'immagine, si utilizza un oggetto ImageDrawing. La proprietà ImageSource di un oggetto ImageDrawing descrive l'immagine da disegnare, mentre la proprietà Rect definisce l'area in cui viene tracciata l'immagine.

Nell'esempio riportato di seguito viene disegnata un'immagine in un rettangolo posizionata nel punto (75,75) vale a dire 100 x 100 pixel. Nella figura riportata di seguito viene illustrato l'oggetto ImageDrawing creato dall'esempio. Un bordo grigio è stato aggiunto per mostrare i limiti dell'oggetto ImageDrawing.

Un oggetto ImageDrawing 100 x 100

ImageDrawing di 100 per 100 disegnata in corrispondenza di (75,75)

// 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 ulteriori informazioni sulle immagini, vedere Cenni preliminari sulla creazione dell'immagine.

Riprodurre contenuti multimediali (Solo codice)

NotaNota

Anche se è possibile dichiarare un oggetto VideoDrawing in Extensible Application Markup Language (XAML), è possibile caricare e riprodurre i contenuti multimediali relativi solo utilizzando il codice.Per riprodurre video in Extensible Application Markup Language (XAML), utilizzare invece MediaElement.

Per riprodurre un file audio o video, si utilizza un oggetto VideoDrawing e MediaPlayer. È possibile caricare e riprodurre contenuti multimediali in due modi diversi. Il primo consiste nell'utilizzo di MediaPlayer e di un oggetto VideoDrawing da soli e il secondo nella creazione di un oggetto MediaTimeline personalizzato da utilizzare con MediaPlayer e VideoDrawing.

NotaNota

Quando si distribuiscono contenuti multimediali con l'applicazione, non è possibile utilizzare un file multimediale come risorsa di progetto, come avviene per un'immagine.Nel file di progetto è invece necessario impostare il tipo di contenuti multimediali su Content e CopyToOutputDirectory su PreserveNewest o su Always.

Per riprodurre contenuti multimediali senza creare un oggetto MediaTimeline personalizzato, attenersi alla seguente procedura.

  1. Creare un oggetto MediaPlayer.

    MediaPlayer player = new MediaPlayer();
    
  2. Utilizzare il metodo Open per caricare il file multimediale.

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

    VideoDrawing aVideoDrawing = new VideoDrawing();
    
  4. Specificare dimensioni e posizione per tracciare il contenuto multimediale impostando la proprietà Rect dell'oggetto VideoDrawing.

    aVideoDrawing.Rect = new Rect(0, 0, 100, 100);
    
  5. Impostare la proprietà Player dell'oggetto VideoDrawing con l'oggetto MediaPlayer creato.

    aVideoDrawing.Player = player;
    
  6. Utilizzare il metodo Play dell'oggetto MediaPlayer per iniziare la riproduzione del contenuto multimediale.

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

Nell'esempio riportato di seguito viene utilizzato un oggetto VideoDrawing e un oggetto MediaPlayer per riprodurre un file video una volta.

//
// 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 un ulteriore controllo della durata dei contenuti multimediali, utilizzare un oggetto MediaTimeline con gli oggetti MediaPlayer e VideoDrawing. L'oggetto MediaTimeline consente di specificare se il file video deve essere ripetuto. Per utilizzare un oggetto MediaTimeline con un oggetto VideoDrawing, attenersi alla seguente procedura:

  1. Dichiarare l'oggetto MediaTimeline e impostarne i comportamenti temporali.

    // 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 un oggetto MediaClock da MediaTimeline.

    // Create a clock from the MediaTimeline.
    MediaClock mClock = mTimeline.CreateClock();
    
  3. Creare un oggetto MediaPlayer e utilizzare MediaClock per impostarne la proprietà Clock.

    MediaPlayer repeatingVideoDrawingPlayer = new MediaPlayer();
    repeatingVideoDrawingPlayer.Clock = mClock;
    
  4. Creare un oggetto VideoDrawing e assegnare l'oggetto MediaPlayer alla proprietà Player dell'oggetto VideoDrawing.

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

Nell'esempio riportato di seguito viene utilizzato un elemento MediaTimeline con un oggetto MediaPlayer e un oggetto VideoDrawing per riprodurre ripetutamente un video.

//
// 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;  

Quando si utilizza un oggetto MediaTimeline, si impiega l'oggetto interattivo ClockController restituito dalla proprietà Controller dell'oggetto MediaClock per controllare la riproduzione di contenuti multimediali invece dei metodi interattivi di MediaPlayer.

Creare testo

Per creare testo, si utilizza un oggetto GlyphRunDrawing e un oggetto GlyphRun. Nell'esempio riportato di seguito viene utilizzato un oggetto GlyphRunDrawing per creare il testo "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>

GlyphRun è un oggetto di livello basso da utilizzare con scenari di presentazione e di stampa di documenti con formato fisso. Un modo più semplice di creare testo sullo schermo consiste nell'utilizzo di Label oppure di TextBlock. Per ulteriori informazioni su GlyphRun, vedere Introduzione all'oggetto GlyphRun e all'elemento Glyphs.

Disegni composti

Un oggetto DrawingGroup consente di combinare più disegni in un unico disegno composto. Utilizzando un oggetto DrawingGroup, è possibile combinare forme, immagini e testo in un singolo oggetto Drawing.

Nell'esempio riportato di seguito viene utilizzato un oggetto DrawingGroup per combinare due oggetti GeometryDrawing e un oggetto ImageDrawing. Questo esempio produce l'output che segue.

Un disegno composto

DrawingGroup con più disegni

            //
            // 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>

DrawingGroup consente inoltre di applicare maschere di opacità, trasformazioni, effetti bitmap e altre operazioni al contenuto relativo. Le operazioni DrawingGroup vengono applicate nel seguente ordine: OpacityMask, Opacity, BitmapEffect, ClipGeometry, GuidelineSet, quindi Transform.

Nella figura riportata di seguito viene illustrato l’ordine in cui vengono applicate le operazioni dell'oggetto DrawingGroup.

Ordine delle operazioni dell'oggetto DrawingGroup

Ordine delle operazioni DrawingGroup

Nella tabella riportata di seguito vengono descritte le proprietà che si possono utilizzare per manipolare il contenuto di un oggetto DrawingGroup.

Proprietà

Descrizione

Illustrazione

OpacityMask

Consente di modificare l'opacità delle porzioni selezionate del contenuto dell'oggetto DrawingGroup. Per un esempio, vedere How to: Control the Opacity of a Drawing.

DrawingGroup con maschera di opacità

Opacity

Consente di modificare in modo uniforme l'opacità del contenuto dell'oggetto DrawingGroup. Utilizzare questa proprietà per rendere un oggetto Drawing trasparente o parzialmente trasparente. Per un esempio, vedere How to: Apply an Opacity Mask to a Drawing.

DrawingGroup con impostazioni di opacità diverse

BitmapEffect

Consente di applicare un elemento BitmapEffect al contenuto dell'oggetto DrawingGroup. Per un esempio, vedere How to: Apply a BitmapEffect to a Drawing.

DrawingGroup con BlurBitmapEffect

ClipGeometry

Consente di ritagliare il contenuto dell'oggetto DrawingGroup ottenendo un'area descritta mediante un oggetto Geometry. Per un esempio, vedere How to: Clip a Drawing.

DrawingGroup con area di ritaglio definita

GuidelineSet

Consente di bloccare Device Independent Pixel ai pixel del dispositivo lungo le linee guida specificate. Questa proprietà è utile per garantire che il rendering degli elementi grafici dettagliati venga eseguito con precisione su schermi a DPI basso. Per un esempio, vedere Procedura: applicare un GuidelineSet a un disegno.

DrawingGroup con e senza GuidelineSet

Transform

Consente di trasformare il contenuto dell'oggetto DrawingGroup. Per un esempio, vedere How to: Apply a Transform to a Drawing.

DrawingGroup ruotato

Visualizzare un disegno come immagine

Per visualizzare un oggetto Drawing con un controllo Image, utilizzare un oggetto DrawingImage come Source del controllo Image e impostare la proprietà DrawingImage.Drawing dell'oggetto DrawingImage sul disegno che si desidera visualizzare.

Nell'esempio riportato di seguito viene utilizzato un oggetto DrawingImage e un controllo Image per visualizzare un oggetto GeometryDrawing. Questo esempio produce l'output che segue.

Un oggetto DrawingImage

GeometryDrawing di due ellissi

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="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:PresentationOptions="https://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
  xmlns:mc="https://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 oggetto Drawing

Un oggetto DrawingBrush è un tipo di pennello che traccia un'area con un oggetto Drawing. Può essere utilizzato per disegnare quasi tutti gli oggetti grafici con un oggetto Drawing. La proprietà Drawing di un oggetto DrawingBrush ne descrive l'oggetto Drawing. Per eseguire il rendering di un oggetto Drawing con un oggetto DrawingBrush, aggiungerlo al pennello utilizzando la proprietà Drawing del pennello e utilizzare il pennello per disegnare un oggetto grafico, come un controllo o un pannello.

Nell'esempio riportato di seguito viene utilizzato un oggetto DrawingBrush per disegnare l'oggetto Fill di un oggetto Rectangle con un modello creato da un oggetto GeometryDrawing. Questo esempio produce l'output che segue.

Un oggetto GeometryDrawing utilizzato con un oggetto DrawingBrush

DrawingBrush affiancato

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="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:PresentationOptions="https://schemas.microsoft.com/winfx/2006/xaml/presentation/options" 
  xmlns:mc="https://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 fornisce una serie di opzioni per l'allungamento e l'affiancamento del contenuto. Per ulteriori informazioni su DrawingBrush, vedere Disegnare con oggetti Image, Drawing e Visual.

Rendering di un disegno con un oggetto Visual

DrawingVisual è un tipo di oggetto Visual progettato per eseguire il rendering di un disegno. 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 questi cenni preliminari. Per ulteriori informazioni, vedere Utilizzo degli oggetti DrawingVisual.

Oggetti DrawingContext

La classe DrawingContext consente di popolare un oggetto Visual oppure Drawing con contenuto visivo. Molti oggetti grafici di livello inferiore di questo tipo utilizzano un oggetto DrawingContext perché descrive il contenuto grafico in modo molto efficace.

Sebbene i metodi di disegno di DrawingContext possano sembrare simili ai metodi di disegno di System.Drawing.Graphics, sono effettivamente molto diversi. DrawingContext viene utilizzato con un sistema grafico in modalità differita, mentre il tipo System.Drawing.Graphics viene utilizzato con un sistema grafico a modalità immediata. Quando si utilizzano i comandi di disegno di un oggetto DrawingContext, si archivia un insieme di istruzioni di redering (sebbene l'esatto meccanismo di archiviazione dipenda dal tipo di oggetto che fornisce l'oggetto DrawingContext), che verrà utilizzato in un secondo tempo dal sistema grafico. Non si disegna sullo schermo in tempo reale. Per ulteriori informazioni sul funzionamento del sistema grafico di Windows Presentation Foundation (WPF), vedere Cenni preliminari sul rendering della grafica WPF.

Non si crea mai direttamente un'istanza di DrawingContext, tuttavia è possibile acquisire un contesto di disegno tramite determinati metodi, ad esempio DrawingGroup.Open e DrawingVisual.RenderOpen.

Enumerare il contenuto di un oggetto Visual

Oltre agli altri utilizzi, gli oggetti Drawing forniscono anche un modello a oggetti per l'enumerazione del contenuto di un oggetto Visual.

Nell’esempio riportato di seguito viene utilizzato il metodo GetDrawing per recuperare il valore DrawingGroup di un oggetto Visual e per enumerarlo.

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

}

 // 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.GetType() == typeof(DrawingGroup))
         {
             EnumDrawingGroup((DrawingGroup)drawing);
         }
         else if (drawing.GetType() == typeof(GeometryDrawing))
         {
             // Perform action based on drawing type.  
         }
         else if (drawing.GetType() == typeof(ImageDrawing))
         {
             // Perform action based on drawing type.
         }
         else if (drawing.GetType() == typeof(GlyphRunDrawing))
         {
             // Perform action based on drawing type.
         }
         else if (drawing.GetType() == typeof(VideoDrawing))
         {
             // Perform action based on drawing type.
         }
     }
 }

Vedere anche

Riferimenti

Drawing

DrawingGroup

Concetti

Ottimizzazione delle prestazioni: grafica bidimensionale e creazione di immagini

Disegnare con oggetti Image, Drawing e Visual

Cenni preliminari sulle classi Geometry

Cenni preliminari sugli oggetti Shape e sulle funzionalità di disegno di base di WPF

Cenni preliminari sul rendering della grafica WPF

Cenni preliminari sugli oggetti Freezable

Altre risorse

Procedure relative agli oggetti Drawing