Sdílet prostřednictvím


Přehled štětců WPF

Všechno viditelné na obrazovce je viditelné, protože ho namaloval štětec. Například štětec slouží k popisu pozadí tlačítka, popředí textu a výplně obrazce. Toto téma představuje koncepty malování pomocí štětců WPF (Windows Presentation Foundation) a poskytuje příklady. Štětce umožňují malovat objekty uživatelského rozhraní s čímkoli od jednoduchých, plných barev až po složité sady vzorů a obrázků.

Malování štětcem

Brush "maluje" oblast svým výstupem. Různé štětce mají různé typy výstupu. Některé štětce malují oblast plnou barvou, jiné s přechodem, vzorem, obrázkem nebo výkresem. Následující obrázek ukazuje příklady jednotlivých typů Brush.

typy štětců
Příklady štětců

Většina vizuálních objektů umožňuje určit, jak se malují. Následující tabulka uvádí některé běžné objekty a vlastnosti, se kterými můžete použít Brush.

Třída Vlastnosti štětce
Border BorderBrush, Background
Control Background, Foreground
Panel Background
Pen Brush
Shape Fill, Stroke
TextBlock Background

Následující části popisují různé typy Brush a poskytují příklad jednotlivých typů.

Malovat jednolitou barvou

SolidColorBrush maluje oblast jednolitou barvou Color. Existují různé způsoby, jak zadat ColorSolidColorBrush: můžete například zadat její alfa, červené, modré a zelené kanály, nebo použít některou z předdefinovaných barev, které poskytuje třída Colors.

Následující příklad používá SolidColorBrush pro namalování Fill barvy Rectangle. Následující obrázek znázorňuje malovaný obdélník.

Obdélník malovaný pomocí SolidColorBrush
Obdélník malovaný pomocí SolidColorBrush

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>

Další informace o třídě SolidColorBrush naleznete v tématu Přehled malby s plnými barvami a přechody.

Malovat s lineárním přechodem

LinearGradientBrush nakreslí oblast lineárním přechodem. Lineární gradient míchá dvě nebo více barev podél osy, která je osou přechodu. Objekty GradientStop slouží k určení barev v přechodu a jejich pozicích.

Následující příklad používá LinearGradientBrush k malování na FillRectangle. Následující obrázek znázorňuje malovaný obdélník.

Obdélník namalovaný pomocí LineárníhoGradientového štětce
Obdélník malovaný pomocí LinearGradientBrush

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>

Další informace o LinearGradientBrush třídy naleznete v tématu Obraz s plnými barvami a přechody Přehled.

Malování s radiálním přechodem

RadialGradientBrush maluje oblast radiálním přechodem. Paprskový přechod prolíná dvě nebo více barev v kruhu. Stejně jako u třídy LinearGradientBrush použijete GradientStop objekty k určení barev v přechodu a jejich pozicích.

Následující příklad používá RadialGradientBrush pro malování Fill na Rectangle. Následující obrázek znázorňuje malovaný obdélník.

Obdélník malovaný pomocí RadialGradientBrush
Obdélník malovaný pomocí RadialGradientBrush

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>

Další informace o třídě RadialGradientBrush viz Přehled malby plnými barvami a přechody.

Malování pomocí obrázku

ImageBrush maluje oblast pomocí ImageSource.

Následující příklad používá ImageBrush k vymalování Fill ze Rectangle. Následující obrázek znázorňuje malovaný obdélník.

Obdélník malovaný pomocí štětce obrazu
Obdélník malovaný pomocí obrázku

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>

Další informace o třídě ImageBrush naleznete v tématu Malování s obrázky, kresbami a vizuály.

Malování pomocí kresby

DrawingBrush maluje oblast s Drawing. Drawing může obsahovat obrazce, obrázky, text a média.

Následující příklad používá DrawingBrush k namalování FillRectangle. Následující obrázek znázorňuje malovaný obdélník.

Obdélník malovaný pomocí DrawingBrush
Obdélník malovaný pomocí DrawingBrush

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>

Pro více informací o třídě DrawingBrush naleznete v tématu Malování s obrázky, kresbami a vizuály.

Malování pomocí vizuálu

VisualBrush maluje oblast s objektem Visual. Příklady vizuálních objektů zahrnují Button, Pagea MediaElement. VisualBrush také umožňuje projektovat obsah z jedné části aplikace do jiné oblasti; Je velmi užitečné při vytváření efektů odrazu a zvětšení částí obrazovky.

Následující příklad používá VisualBrush pro malování FillRectangle. Následující obrázek znázorňuje malovaný obdélník.

Obdélník malovaný pomocí VisualBrush
Obdélník malovaný pomocí vizuálního štětce

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>

Další informace o třídě VisualBrush viz Malování s obrazy, kresbami a vizuály.

Malování pomocí předdefinovaných a systémových štětců

Pro usnadnění poskytuje Windows Presentation Foundation (WPF) sadu předdefinovaných a systémových štětců, které můžete použít k malování objektů.

Běžné funkce štětce

Brush objekty poskytují vlastnost Opacity, kterou lze použít k nastavení štětce jako průhledného nebo částečně průhledného. Hodnota Opacity 0 dělá štětec zcela průhledný, zatímco Opacity hodnota 1 dělá štětec zcela neprůhledný. Následující příklad používá vlastnost Opacity, aby bylo SolidColorBrush 25 procent neprůhledné.

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

Pokud štětec obsahuje barvy, které jsou částečně průhledné, hodnota jejich neprůhlednosti se kombinuje násobením s hodnotou neprůhlednosti štětce. Pokud má například štětec hodnotu neprůhlednosti 0,5 a barva použitá v štětci má také neprůhlednou hodnotu 0,5, má výstupní barva hodnotu neprůhlednosti 0,25.

Poznámka

Je efektivnější změnit hodnotu neprůhlednosti štětce, než je změnit neprůhlednost celého prvku pomocí jeho vlastnosti UIElement.Opacity.

Obsah štětce můžete otočit, škálovat, zkosit a přeložit pomocí jeho Transform nebo RelativeTransform vlastností. Další informace naleznete v tématu Přehled transformace štětce.

Vzhledem k tomu, že jsou Animatable objekty, mohou být Brush objekty animované. Další informace naleznete v tématu Přehled animací.

Zmrazitelné funkce

Vzhledem k tomu, že dědí z třídy Freezable, poskytuje třída Brush několik speciálních funkcí: Brush objekty lze deklarovat jako prostředky, sdíleny mezi více objekty a klonovány. Kromě toho lze všechny typy Brush s výjimkou VisualBrush zpřístupnit pouze pro čtení, aby se zlepšil výkon, a budou bezpečné pro přístup z více vláken.

Další informace o různých funkcích poskytovaných objekty Freezable naleznete v tématu Přehled zamrznutelných objektů.

Další informace o tom, proč nelze VisualBrush objekty zmrazit, naleznete na stránce s typem VisualBrush.

Viz také