Übersicht über WPF-Pinsel

Alles, was auf dem Bildschirm sichtbar ist, ist sichtbar, weil es von einem Pinsel gezeichnet wurde. Beispielsweise wird ein Pinsel verwendet, um den Hintergrund einer Schaltfläche, den Vordergrund des Texts und die Füllung einer Form zu beschreiben. In diesem Thema werden die Konzepte für das Zeichnen mit WPF-Pinseln (Windows Presentation Foundation) vorgestellt und Beispiele bereitgestellt. Mithilfe von Pinseln können Sie Benutzeroberflächenobjekte zeichnen, angefangen von einfachen Objekten, über Objekte in Volltonfarbe bis hin zu Objekten mit komplexen Mustern und Bildern.

Malen mit einem Pinsel

Ein Brush "malt" einen Bereich mit seiner Ausgabe. Verschiedene Pinsel haben unterschiedliche Ausgabetypen. Einige Pinsel zeichnen einen Bereich mit einer Volltonfarbe, andere mit einem Farbverlauf, Muster, Bild oder Zeichnung. Die folgende Abbildung zeigt Beispiele für jede der verschiedenen Brush-Typen.

Brush types
Pinselbeispiele

Mit den meisten visuellen Objekten können Sie angeben, wie sie gezeichnet werden. In der folgenden Tabelle sind einige gängige Objekte und Eigenschaften aufgeführt, mit denen Sie eine Brush.

Klasse Pinseleigenschaften
Border BorderBrush, Background
Control Background, Foreground
Panel Background
Pen Brush
Shape Fill, Stroke
TextBlock Background

In den folgenden Abschnitten werden die verschiedenen Brush-Typen beschrieben und ein Beispiel für jeden bereitgestellt.

Maeln mit einer einfarbigen Farbe

SolidColorBrush malt eine Fläche mit einem festen Color. Es gibt eine Vielzahl von Möglichkeiten zum Angeben eines Color von SolidColorBrush: z. B. können Sie seine Alpha-, Rot-, Blau- und Grünkanäle angeben oder eine der vordefinierten Farben verwenden, die von der Colors-Klasse bereitgestellt werden.

Das folgende Beispiel verwendet SolidColorBrush ein Fill, um das Bild eines Rectangle zu malen. Die folgende Abbildung zeigt das bemalte Rechteck.

A rectangle painted using a SolidColorBrush
Ein mit einem SolidColorBrush gezeichnetes Rechteck

Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 75;
exampleRectangle.Height = 75;

// Create a SolidColorBrush and use it to
// paint the rectangle.
SolidColorBrush myBrush = new SolidColorBrush(Colors.Red);
exampleRectangle.Fill = myBrush;
Dim exampleRectangle As New Rectangle()
exampleRectangle.Width = 75
exampleRectangle.Height = 75

' Create a SolidColorBrush and use it to
' paint the rectangle.
Dim myBrush As New SolidColorBrush(Colors.Red)
exampleRectangle.Fill = myBrush
<Rectangle Width="75" Height="75">
  <Rectangle.Fill>
    <SolidColorBrush Color="Red" />
  </Rectangle.Fill>
</Rectangle>

Weitere Informationen über die SolidColorBrush-Klasse finden Sie unter Übersicht über das Zeichnen mit Volltonfarben und Farbverläufen.

Malen mit einem linearen Farbverlauf

LinearGradientBrush zeichnet einen Bereich mit einem linearen Farbverlauf. Ein linearer Farbverlauf blendet zwei oder mehr Farben über eine Linie hinweg, die Farbverlaufsachse. Sie verwenden GradientStop-Objekte, um die Farben im Farbverlauf und deren Positionen anzugeben.

Das folgende Beispiel verwendet LinearGradientBrush ein Fill, um das Bild eines Rectangle zu malen. Die folgende Abbildung zeigt das bemalte Rechteck.

A rectangle painted using a LinearGradientBrush
Ein mit einem LinearGradientBrush gezeichnetes Rechteck

Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 75;
exampleRectangle.Height = 75;

// Create a LinearGradientBrush and use it to
// paint the rectangle.
LinearGradientBrush myBrush = new LinearGradientBrush();
myBrush.GradientStops.Add(new GradientStop(Colors.Yellow, 0.0));
myBrush.GradientStops.Add(new GradientStop(Colors.Orange, 0.5));
myBrush.GradientStops.Add(new GradientStop(Colors.Red, 1.0));

exampleRectangle.Fill = myBrush;
Dim exampleRectangle As New Rectangle()
exampleRectangle.Width = 75
exampleRectangle.Height = 75

' Create a LinearGradientBrush and use it to
' paint the rectangle.
Dim myBrush As New LinearGradientBrush()
myBrush.GradientStops.Add(New GradientStop(Colors.Yellow, 0.0))
myBrush.GradientStops.Add(New GradientStop(Colors.Orange, 0.5))
myBrush.GradientStops.Add(New GradientStop(Colors.Red, 1.0))

exampleRectangle.Fill = myBrush
<Rectangle Width="75" Height="75">
  <Rectangle.Fill>
    <LinearGradientBrush>
      <GradientStop Color="Yellow" Offset="0.0" />
      <GradientStop Color="Orange" Offset="0.5" />
      <GradientStop Color="Red" Offset="1.0" />
    </LinearGradientBrush>
  </Rectangle.Fill>
</Rectangle>

Weitere Informationen über die LinearGradientBrush-Klasse finden Sie unter Übersicht über das Zeichnen mit Volltonfarben und Farbverläufen.

Malen mit einem radialen Farbverlauf

RadialGradientBrush zeichnet einen Bereich mit einem radialen Farbverlauf. Ein radialer Farbverlauf blendet zwei oder mehr Farben über einen Kreis hinweg. Wie bei der LinearGradientBrush-Klasse, verwenden Sie GradientStop-Objekte, um die Farben im Farbverlauf und deren Positionen anzugeben.

Das folgende Beispiel verwendet RadialGradientBrush ein Fill, um das Bild eines Rectangle zu malen. Die folgende Abbildung zeigt das bemalte Rechteck.

A rectangle painted using a RadialGradientBrush
Ein mit einem RadialGradientBrush gezeichnetes Rechteck

Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 75;
exampleRectangle.Height = 75;

// Create a RadialGradientBrush and use it to
// paint the rectangle.
RadialGradientBrush myBrush = new RadialGradientBrush();
myBrush.GradientOrigin = new Point(0.75, 0.25);
myBrush.GradientStops.Add(new GradientStop(Colors.Yellow, 0.0));
myBrush.GradientStops.Add(new GradientStop(Colors.Orange, 0.5));
myBrush.GradientStops.Add(new GradientStop(Colors.Red, 1.0));

exampleRectangle.Fill = myBrush;
Dim exampleRectangle As New Rectangle()
exampleRectangle.Width = 75
exampleRectangle.Height = 75

' Create a RadialGradientBrush and use it to
' paint the rectangle.
Dim myBrush As New RadialGradientBrush()
myBrush.GradientOrigin = New Point(0.75, 0.25)
myBrush.GradientStops.Add(New GradientStop(Colors.Yellow, 0.0))
myBrush.GradientStops.Add(New GradientStop(Colors.Orange, 0.5))
myBrush.GradientStops.Add(New GradientStop(Colors.Red, 1.0))

exampleRectangle.Fill = myBrush
<Rectangle Width="75" Height="75">
  <Rectangle.Fill>
    <RadialGradientBrush GradientOrigin="0.75,0.25">
      <GradientStop Color="Yellow" Offset="0.0" />
      <GradientStop Color="Orange" Offset="0.5" />
      <GradientStop Color="Red" Offset="1.0" />
    </RadialGradientBrush>
  </Rectangle.Fill>
</Rectangle>

Weitere Informationen über die RadialGradientBrush-Klasse finden Sie unter Übersicht über das Zeichnen mit Volltonfarben und Farbverläufen.

Paint mit einem Bild

Eine ImageBrush zeichnet einen Bereich mit einem ImageSource.

Das folgende Beispiel verwendet ImageBrush ein Fill, um das Bild eines Rectangle zu malen. Die folgende Abbildung zeigt das bemalte Rechteck.

A Rectangle painted by an ImageBrush
Ein Rechteck, das mit einem Bild gezeichnet wird

Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 75;
exampleRectangle.Height = 75;

// Create an ImageBrush and use it to
// paint the rectangle.
ImageBrush myBrush = new ImageBrush();
myBrush.ImageSource =
    new BitmapImage(new Uri(@"sampleImages\pinkcherries.jpg", UriKind.Relative));

exampleRectangle.Fill = myBrush;
Dim exampleRectangle As New Rectangle()
exampleRectangle.Width = 75
exampleRectangle.Height = 75

' Create an ImageBrush and use it to
' paint the rectangle.
Dim myBrush As New ImageBrush()
myBrush.ImageSource = New BitmapImage(New Uri("sampleImages\pinkcherries.jpg", UriKind.Relative))

exampleRectangle.Fill = myBrush
<Rectangle Width="75" Height="75">
  <Rectangle.Fill>
    <ImageBrush ImageSource="sampleImages\pinkcherries.jpg"  />
  </Rectangle.Fill>
</Rectangle>

Weitere Informationen zur ImageBrush-Klasse finden Sie unter Zeichnen mit Bildern, Zeichnungen und visuellen Elementen.

Malen mit einer Zeichnung

DrawingBrush zeichnet einen Bereich mit einem Drawing. Eine Drawing kann Formen, Bilder, Text und Medien enthalten.

Das folgende Beispiel verwendet DrawingBrush ein Fill, um das Bild eines Rectangle zu malen. Die folgende Abbildung zeigt das bemalte Rechteck.

A rectangle painted using a DrawingBrush
Ein mit einem DrawingBrush gezeichnetes Rechteck

Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 75;
exampleRectangle.Height = 75;

// Create a DrawingBrush and use it to
// paint the rectangle.
DrawingBrush myBrush = new DrawingBrush();

GeometryDrawing backgroundSquare =
    new GeometryDrawing(
        Brushes.White,
        null,
        new RectangleGeometry(new Rect(0, 0, 100, 100)));

GeometryGroup aGeometryGroup = new GeometryGroup();
aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(0, 0, 50, 50)));
aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(50, 50, 50, 50)));

LinearGradientBrush checkerBrush = new LinearGradientBrush();
checkerBrush.GradientStops.Add(new GradientStop(Colors.Black, 0.0));
checkerBrush.GradientStops.Add(new GradientStop(Colors.Gray, 1.0));

GeometryDrawing checkers = new GeometryDrawing(checkerBrush, null, aGeometryGroup);

DrawingGroup checkersDrawingGroup = new DrawingGroup();
checkersDrawingGroup.Children.Add(backgroundSquare);
checkersDrawingGroup.Children.Add(checkers);

myBrush.Drawing = checkersDrawingGroup;
myBrush.Viewport = new Rect(0, 0, 0.25, 0.25);
myBrush.TileMode = TileMode.Tile;

exampleRectangle.Fill = myBrush;
Dim exampleRectangle As New Rectangle()
exampleRectangle.Width = 75
exampleRectangle.Height = 75

' Create a DrawingBrush and use it to
' paint the rectangle.
Dim myBrush As New DrawingBrush()

Dim backgroundSquare As New GeometryDrawing(Brushes.White, Nothing, New RectangleGeometry(New Rect(0, 0, 100, 100)))

Dim aGeometryGroup As New GeometryGroup()
aGeometryGroup.Children.Add(New RectangleGeometry(New Rect(0, 0, 50, 50)))
aGeometryGroup.Children.Add(New RectangleGeometry(New Rect(50, 50, 50, 50)))

Dim checkerBrush As New LinearGradientBrush()
checkerBrush.GradientStops.Add(New GradientStop(Colors.Black, 0.0))
checkerBrush.GradientStops.Add(New GradientStop(Colors.Gray, 1.0))

Dim checkers As New GeometryDrawing(checkerBrush, Nothing, aGeometryGroup)

Dim checkersDrawingGroup As New DrawingGroup()
checkersDrawingGroup.Children.Add(backgroundSquare)
checkersDrawingGroup.Children.Add(checkers)

myBrush.Drawing = checkersDrawingGroup
myBrush.Viewport = New Rect(0, 0, 0.25, 0.25)
myBrush.TileMode = TileMode.Tile

exampleRectangle.Fill = myBrush
<Rectangle Width="75" Height="75">
  <Rectangle.Fill>
    <DrawingBrush Viewport="0,0,0.25,0.25" TileMode="Tile">
      <DrawingBrush.Drawing>
        <DrawingGroup>
          <GeometryDrawing Brush="White">
            <GeometryDrawing.Geometry>
              <RectangleGeometry Rect="0,0,100,100" />
            </GeometryDrawing.Geometry>
          </GeometryDrawing>

          <GeometryDrawing>
            <GeometryDrawing.Geometry>
              <GeometryGroup>
                <RectangleGeometry Rect="0,0,50,50" />
                <RectangleGeometry Rect="50,50,50,50" />
              </GeometryGroup>
            </GeometryDrawing.Geometry>
            <GeometryDrawing.Brush>
              <LinearGradientBrush>
                <GradientStop Offset="0.0" Color="Black" />
                <GradientStop Offset="1.0" Color="Gray" />
              </LinearGradientBrush>
            </GeometryDrawing.Brush>
          </GeometryDrawing>
        </DrawingGroup>
      </DrawingBrush.Drawing>
    </DrawingBrush>
  </Rectangle.Fill>
</Rectangle>

Weitere Informationen zur DrawingBrush-Klasse finden Sie unter Zeichnen mit Bildern, Zeichnungen und visuellen Elementen.

Mit einem Visual malen

Ein VisualBrush-Objekt zeichnet einen Bereich mit einem Visual-Objekt. Beispiele für visuelle Objekte sind Button, Page und MediaElement. Außerdem können Sie mit VisualBrush Inhalte aus einem Teil Ihrer Anwendung in einen anderen Bereich projizieren. Es ist sehr nützlich, Spiegelungseffekte zu erstellen und Teile des Bildschirms zu vergrößern.

Das folgende Beispiel verwendet VisualBrush ein Fill, um das Bild eines Rectangle zu malen. Die folgende Abbildung zeigt das bemalte Rechteck.

A rectangle painted using a VisualBrush
Ein mit einem VisualBrush gezeichnetes Rechteck

Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 75;
exampleRectangle.Height = 75;

// Create a VisualBrush and use it
// to paint the rectangle.
VisualBrush myBrush = new VisualBrush();

//
// Create the brush's contents.
//
StackPanel aPanel = new StackPanel();

// Create a DrawingBrush and use it to
// paint the panel.
DrawingBrush myDrawingBrushBrush = new DrawingBrush();
GeometryGroup aGeometryGroup = new GeometryGroup();
aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(0, 0, 50, 50)));
aGeometryGroup.Children.Add(new RectangleGeometry(new Rect(50, 50, 50, 50)));
RadialGradientBrush checkerBrush = new RadialGradientBrush();
checkerBrush.GradientStops.Add(new GradientStop(Colors.MediumBlue, 0.0));
checkerBrush.GradientStops.Add(new GradientStop(Colors.White, 1.0));
GeometryDrawing checkers = new GeometryDrawing(checkerBrush, null, aGeometryGroup);
myDrawingBrushBrush.Drawing = checkers;
aPanel.Background = myDrawingBrushBrush;

// Create some text.
TextBlock someText = new TextBlock();
someText.Text = "Hello, World";
FontSizeConverter fSizeConverter = new FontSizeConverter();
someText.FontSize = (double)fSizeConverter.ConvertFromString("10pt");
someText.Margin = new Thickness(10);

aPanel.Children.Add(someText);

myBrush.Visual = aPanel;
exampleRectangle.Fill = myBrush;

Dim exampleRectangle As New Rectangle()
exampleRectangle.Width = 75
exampleRectangle.Height = 75

' Create a VisualBrush and use it
' to paint the rectangle.
Dim myBrush As New VisualBrush()

'
' Create the brush's contents.
'
Dim aPanel As New StackPanel()

' Create a DrawingBrush and use it to
' paint the panel.
Dim myDrawingBrushBrush As New DrawingBrush()
Dim aGeometryGroup As New GeometryGroup()
aGeometryGroup.Children.Add(New RectangleGeometry(New Rect(0, 0, 50, 50)))
aGeometryGroup.Children.Add(New RectangleGeometry(New Rect(50, 50, 50, 50)))
Dim checkerBrush As New RadialGradientBrush()
checkerBrush.GradientStops.Add(New GradientStop(Colors.MediumBlue, 0.0))
checkerBrush.GradientStops.Add(New GradientStop(Colors.White, 1.0))
Dim checkers As New GeometryDrawing(checkerBrush, Nothing, aGeometryGroup)
myDrawingBrushBrush.Drawing = checkers
aPanel.Background = myDrawingBrushBrush

' Create some text.
Dim someText As New TextBlock()
someText.Text = "Hello, World"
Dim fSizeConverter As New FontSizeConverter()
someText.FontSize = CDbl(fSizeConverter.ConvertFromString("10pt"))
someText.Margin = New Thickness(10)

aPanel.Children.Add(someText)

myBrush.Visual = aPanel
exampleRectangle.Fill = myBrush

<Rectangle Width="75" Height="75">
  <Rectangle.Fill>
    <VisualBrush TileMode="Tile">
      <VisualBrush.Visual>
        <StackPanel>
          <StackPanel.Background>
            <DrawingBrush>
              <DrawingBrush.Drawing>
                <GeometryDrawing>
                  <GeometryDrawing.Brush>
                    <RadialGradientBrush>
                      <GradientStop Color="MediumBlue" Offset="0.0" />
                      <GradientStop Color="White" Offset="1.0" />
                    </RadialGradientBrush>
                  </GeometryDrawing.Brush>
                  <GeometryDrawing.Geometry>
                    <GeometryGroup>
                      <RectangleGeometry Rect="0,0,50,50" />
                      <RectangleGeometry Rect="50,50,50,50" />
                    </GeometryGroup>
                  </GeometryDrawing.Geometry>
                </GeometryDrawing>
              </DrawingBrush.Drawing>
            </DrawingBrush>
          </StackPanel.Background>
          <TextBlock FontSize="10pt" Margin="10">Hello, World!</TextBlock>
        </StackPanel>
      </VisualBrush.Visual>
    </VisualBrush>
  </Rectangle.Fill>
</Rectangle>

Weitere Informationen zur VisualBrush-Klasse finden Sie unter Zeichnen mit Bildern, Zeichnungen und visuellen Elementen.

Paint mithilfe vordefinierter und Systempinsel

Für den Komfort bietet Windows Presentation Foundation (WPF) eine Reihe vordefinierter und Systempinsel, die Sie zum Zeichnen von Objekten verwenden können.

Allgemeine Pinselfeatures

Brush-Objekte stellen eine Opacity-Eigenschaft bereit, die verwendet werden kann, um einen Pinsel transparent oder teilweise transparent zu machen. Ein Opacity-Wert von 0 macht einen Pinsel vollständig transparent, während ein Opacity-Wert von 1 einen Pinsel vollständig undurchsichtig macht. Im folgenden Beispiel wird die Opacity-Eigenschaft verwendet, um eine SolidColorBrush 25 Prozent undurchsichtig zu machen.

<Rectangle Width="100" Height="100">
  <Rectangle.Fill>
    <SolidColorBrush Color="Blue" Opacity="0.25" />
  </Rectangle.Fill>
</Rectangle>
Rectangle myRectangle = new Rectangle();
myRectangle.Width = 100;
myRectangle.Height = 100;
SolidColorBrush partiallyTransparentSolidColorBrush
    = new SolidColorBrush(Colors.Blue);
partiallyTransparentSolidColorBrush.Opacity = 0.25;
myRectangle.Fill = partiallyTransparentSolidColorBrush;

Wenn der Pinsel Farben enthält, die teilweise transparent sind, wird der Deckkraftwert der Farbe durch Multiplikation mit dem Deckkraftwert des Pinsels kombiniert. Wenn beispielsweise ein Pinsel einen Deckkraftwert von 0,5 hat und eine Farbe, die im Pinsel verwendet wird, auch einen Deckkraftwert von 0,5 aufweist, weist die Ausgabefarbe einen Deckkraftwert von 0,25 auf.

Hinweis

Es ist effizienter, den Deckkraftwert eines Pinsels zu ändern, als die Deckkraft eines gesamten Elements mithilfe seiner UIElement.Opacity-Eigenschaft zu ändern.

Sie können den Inhalt eines Pinsels mit Hilfe seiner Transform- oder RelativeTransform-Eigenschaften drehen, skalieren, schräg stellen und verschieben. Weitere Informationen finden Sie in derÜbersicht über die Pinseltransformation.

Da sie Animatable-Objekte sind, können Brush-Objekte animiert werden. Weitere Informationen finden Sie unter Übersicht über Animation.

Features von Freezable

Da sie von der Freezable-Klasse erbt, bietet die Brush-Klasse mehrere besondere Funktionen: Brush-Objekte können als -Ressourcen deklariert, von mehreren Objekten gemeinsam genutzt und geklont werden. Darüber hinaus können alle Brush-Typen außer VisualBrush schreibgeschützt gemacht werden, um die Leistung zu verbessern und threadsicher zu machen.

Weitere Informationen zu den verschiedenen Funktionen, die Freezable-Objekte bieten, finden Sie unter Übersicht über Freezable-Objekte.

Weitere Informationen dazu, warum VisualBrush-Objekte nicht gesperrt werden können, finden Sie auf der VisualBrush-Typseite.

Siehe auch