이미지, 그림 및 시각적 표시로 그리기Painting with Images, Drawings, and Visuals

이 항목 ImageBrush에서는, DrawingBrushVisualBrush 개체를 사용 하 여 이미지, Drawing또는를 사용 하 Visual여 영역을 그리는 방법을 설명 합니다.This topic describes how to use ImageBrush, DrawingBrush, and VisualBrush objects to paint an area with an image, a Drawing, or a Visual.

전제 조건Prerequisites

이 항목을 이해하려면 WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF)에서 제공하는 다양한 형식의 브러시와 해당 기본 기능에 대해 잘 알고 있어야 합니다.To understand this topic, you should be familiar with the different types of brushes WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF) provides and their basic features. 소개 내용을 보려면 WPF 브러시 개요를 참조하세요.For an introduction, see the WPF Brushes Overview.

이미지로 영역 그리기Paint an Area with an Image

ImageBrush 영역을 그립니다는 ImageSource합니다.An ImageBrush paints an area with an ImageSource. 가장 일반적인 유형의 ImageSource 를 사용 하는 ImageBrushBitmapImage, 비트맵 그래픽을 설명 하는 합니다.The most common type of ImageSource to use with an ImageBrush is a BitmapImage, which describes a bitmap graphic. 사용할 수는 DrawingImage 를 사용 하 여 그릴를 Drawing 개체 이며 간단 하 게 사용을 DrawingBrush 대신 합니다.You can use a DrawingImage to paint using a Drawing object, but it is simpler to use a DrawingBrush instead. 개체에 대 한 ImageSource 자세한 내용은 이미징 개요를 참조 하세요.For more information about ImageSource objects, see the Imaging Overview.

를 사용 하 여 ImageBrush그리려면를 BitmapImage 만든 다음 비트맵 콘텐츠를 로드 하는 데 사용 합니다.To paint with an ImageBrush, create a BitmapImage and use it to load the bitmap content. 그런 다음를 사용 BitmapImage 하 여의 ImageSource ImageBrush속성을 설정 합니다.Then, use the BitmapImage to set the ImageSource property of the ImageBrush. 마지막으로 그리기를 ImageBrush 하려는 개체에를 적용 합니다.Finally, apply the ImageBrush to the object you want to paint. 에서는 로드할 이미지의 경로로의 속성 ImageBrushImageSource 설정할 수도 있습니다. XAML(Extensible Application Markup Language)Extensible Application Markup Language (XAML)In XAML(Extensible Application Markup Language)Extensible Application Markup Language (XAML), you can also just set the ImageSource property of the ImageBrush with the path of the image to load.

모든 Brush 개체ImageBrush 와 마찬가지로를 사용 하 여 도형, 패널, 컨트롤 및 텍스트와 같은 개체를 그릴 수 있습니다.Like all Brush objects, an ImageBrush can be used to paint objects such as shapes, panels, controls, and text. 다음 그림에서는를 사용 ImageBrush하 여 수행할 수 있는 몇 가지 효과를 보여 줍니다.The following illustration shows some effects that can be achieved with an ImageBrush.

ImageBrush 출력 예제ImageBrush output examples
ImageBrush로 그린 개체Objects painted by an ImageBrush

기본적으로는 ImageBrush 이미지를 늘려 그릴 영역을 완전히 채우도록 하며, 그려지는 영역의 가로 세로 비율이 이미지와 다른 경우 이미지를 왜곡 시킬 수 있습니다.By default, an ImageBrush stretches its image to completely fill the area being painted, possibly distorting the image if the painted area has a different aspect ratio than the image. Stretch 속성을의 Fill 기본값에서, None Uniform또는 로변경하여이동작을변경할수있습니다.UniformToFillYou can change this behavior by changing the Stretch property from its default value of Fill to None, Uniform, or UniformToFill. ImageBrushTileBrush형식 이므로 이미지 브러시가 출력 영역을 채우는 방법과 패턴을 만드는 방법을 정확 하 게 지정할 수 있습니다.Because ImageBrush is a type of TileBrush, you can specify exactly how an image brush fills the output area and even create patterns. 고급 TileBrush 기능에 대 한 자세한 내용은 TileBrush 개요를 참조 하세요.For more information about advanced TileBrush features, see the TileBrush Overview.

예제: 비트맵 이미지를 사용 하 여 개체 그리기Example: Paint an Object with a Bitmap Image

다음 예제에서는를 사용 ImageBrush 하 여의 Background Canvas를 그립니다.The following example uses an ImageBrush to paint the Background of a Canvas.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="Microsoft.Samples.BrushExamples.ImageBrushExample"
  WindowTitle="ImageBrush Example"
  Background="White">

  <StackPanel>

    <Canvas
      Height="200" Width="300">
      <Canvas.Background>
        <ImageBrush ImageSource="sampleImages\Waterlilies.jpg" />
      </Canvas.Background>
    </Canvas>

    
  </StackPanel>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace Microsoft.Samples.BrushExamples
{

    public class ImageBrushExample : Page
    {
    
        public ImageBrushExample()
        {
        
            StackPanel mainPanel = new StackPanel();
            canvasBackgroundExample(mainPanel);
            this.Content = mainPanel;
        }

        private void canvasBackgroundExample(Panel mainPanel)
        {
            
            BitmapImage theImage = new BitmapImage
                (new Uri("sampleImages\\Waterlilies.jpg", UriKind.Relative));
            
            ImageBrush myImageBrush = new ImageBrush(theImage);
            
            Canvas myCanvas = new Canvas();
            myCanvas.Width = 300;
            myCanvas.Height = 200;
            myCanvas.Background = myImageBrush;
            
            mainPanel.Children.Add(myCanvas);
        }
    }
}

Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Imaging

Namespace Microsoft.Samples.BrushExamples

    Public Class ImageBrushExample
        Inherits Page

        Public Sub New()

            Dim mainPanel As New StackPanel()
            canvasBackgroundExample(mainPanel)
            Me.Content = mainPanel

        End Sub


        Private Sub canvasBackgroundExample(ByVal mainPanel As Panel)

            Dim theImage As New BitmapImage(New Uri("sampleImages\Waterlilies.jpg", UriKind.Relative))

            Dim myImageBrush As New ImageBrush(theImage)

            Dim myCanvas As New Canvas()
            myCanvas.Width = 300
            myCanvas.Height = 200
            myCanvas.Background = myImageBrush

            mainPanel.Children.Add(myCanvas)


        End Sub

    End Class

End Namespace

Drawing으로 영역 그리기Paint an Area with a Drawing

DrawingBrush 사용 하면 도형, 텍스트, 이미지 및 비디오를 사용 하 여 영역을 그릴 수 있습니다.A DrawingBrush enables you to paint an area with shapes, text, images, and video. 드로잉 브러시 안에 있는 셰이프는 단색, 그라데이션, 이미지 또는 다른 DrawingBrush색으로 그릴 수 있습니다.Shapes inside a drawing brush may themselves be painted with a solid color, gradient, image, or even another DrawingBrush. 다음 그림에서는의 DrawingBrush몇 가지 사용 방법을 보여 줍니다.The following illustration demonstrates some uses of a DrawingBrush.

DrawingBrush 출력 예제DrawingBrush output examples
DrawingBrush로 그린 개체Objects painted by a DrawingBrush

DrawingBrush Drawing 개체를 사용 하 여 영역을 그립니다.A DrawingBrush paints an area with a Drawing object. 개체 Drawing 는 모양, 비트맵, 비디오 또는 텍스트 줄과 같은 표시 되는 콘텐츠를 설명 합니다.A Drawing object describes visible content, such as a shape, bitmap, video, or a line of text. 그리기 형식마다 다른 콘텐츠 형식을 설명합니다.Different types of drawings describe different types of content. 다음은 여러 그리기 개체 형식을 보여 주는 목록입니다.The following is a list of the different types of drawing objects.

개체에 대 한 Drawing 자세한 내용은 Drawing 개체 개요를 참조 하세요.For more information about Drawing objects, see the Drawing Objects Overview.

와 마찬가지로는 DrawingBrush 를 확장 Drawing 하 여 해당 출력 영역을 채웁니다. ImageBrushLike an ImageBrush, a DrawingBrush stretches its Drawing to fill its output area. StretchFill기본 설정에서 속성을 변경 하 여이 동작을 재정의할 수 있습니다.You can override this behavior by changing the Stretch property from its default setting of Fill. 자세한 내용은 Stretch 속성을 참조하세요.For more information, see the Stretch property.

예제: Drawing으로 개체 그리기Example: Paint an Object with a Drawing

다음 예제에서는 3개의 타원 그림으로 개체를 그리는 방법을 보여 줍니다.The following example shows how to paint an object with a drawing of three ellipses. GeometryDrawing 줄임표를 설명 하는 데 사용 됩니다.A GeometryDrawing is used to describe the ellipses.

<Button Content="A Button">
  <Button.Background>
    <DrawingBrush>
      <DrawingBrush.Drawing>
        <GeometryDrawing Brush="LightBlue">
          <GeometryDrawing.Geometry>
            <GeometryGroup>
              <EllipseGeometry RadiusX="12.5" RadiusY="25" Center="25,50" />
              <EllipseGeometry RadiusX="12.5" RadiusY="25" Center="50,50" />
              <EllipseGeometry RadiusX="12.5" RadiusY="25" Center="75,50" />
            </GeometryGroup>
          </GeometryDrawing.Geometry>
          <GeometryDrawing.Pen>
            <Pen Thickness="1" Brush="Gray" />
          </GeometryDrawing.Pen>
        </GeometryDrawing>
      </DrawingBrush.Drawing>
    </DrawingBrush>
  </Button.Background>
</Button>
// Create a DrawingBrush.
DrawingBrush myDrawingBrush = new DrawingBrush();

// Create a drawing.
GeometryDrawing myGeometryDrawing = new GeometryDrawing();
myGeometryDrawing.Brush = Brushes.LightBlue;
myGeometryDrawing.Pen = new Pen(Brushes.Gray, 1);
GeometryGroup ellipses = new GeometryGroup();
ellipses.Children.Add(new EllipseGeometry(new Point(25,50), 12.5, 25));
ellipses.Children.Add(new EllipseGeometry(new Point(50,50), 12.5, 25));
ellipses.Children.Add(new EllipseGeometry(new Point(75,50), 12.5, 25));

myGeometryDrawing.Geometry = ellipses;
myDrawingBrush.Drawing = myGeometryDrawing;

Button myButton = new Button();
myButton.Content = "A Button";

// Use the DrawingBrush to paint the button's background.
myButton.Background = myDrawingBrush;
' Create a DrawingBrush.
Dim myDrawingBrush As New DrawingBrush()

' Create a drawing.
Dim myGeometryDrawing As New GeometryDrawing()
myGeometryDrawing.Brush = Brushes.LightBlue
myGeometryDrawing.Pen = New Pen(Brushes.Gray, 1)
Dim ellipses As New GeometryGroup()
ellipses.Children.Add(New EllipseGeometry(New Point(25,50), 12.5, 25))
ellipses.Children.Add(New EllipseGeometry(New Point(50,50), 12.5, 25))
ellipses.Children.Add(New EllipseGeometry(New Point(75,50), 12.5, 25))

myGeometryDrawing.Geometry = ellipses
myDrawingBrush.Drawing = myGeometryDrawing

Dim myButton As New Button()
myButton.Content = "A Button"

' Use the DrawingBrush to paint the button's background.
myButton.Background = myDrawingBrush

시각적 표시로 영역 그리기Paint an Area with a Visual

에서 VisualBrush 가장 유연 하 고 강력한 모든 브러시는 Visual로 영역을 그립니다.The most versatile and powerful of all the brushes, the VisualBrush paints an area with a Visual. Visual 많은 유용한 그래픽 구성 요소의 상위 항목으로 사용 되는 하위 수준 그래픽 형식입니다.A Visual is a low-level graphical type that serves as the ancestor of many useful graphical components. Window Control Visual 를 들어,, 및 클래스는 모든 형식의 개체입니다. FrameworkElementFor example, the Window, FrameworkElement, and Control classes are all types of Visual objects. 를 사용 하면 거의 모든 WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF) 그래픽 개체를 사용 하 여 영역 을그릴수있습니다.VisualBrushUsing a VisualBrush, you can paint areas with almost any WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF) graphical object.

참고

VisualBrush 개체의 Freezable 형식 이지만 Visual 속성이 이외의 null값으로 설정 된 경우에는 고정할 수 없습니다 (읽기 전용으로 설정 됨).Although VisualBrush is a type of Freezable object, it cannot be frozen (made read-only) when its Visual property is set to a value other than null.

두 가지 방법으로 지정할 수는 Visual 의 콘텐츠는 VisualBrush합니다.There are two ways to specify the Visual content of a VisualBrush.

정의 하는 경우 새 Visual 에 대 한는 VisualBrush 하 고 VisualUIElement (예: 패널 또는 컨트롤)에서 실행 되는 레이아웃 시스템을 UIElement 와 해당 자식 요소 때를 AutoLayoutContent 속성이 true.When you define a new Visual for a VisualBrush and that Visual is a UIElement (such as a panel or control), the layout system runs on the UIElement and its child elements when the AutoLayoutContent property is set to true. 그러나 루트 UIElement 는 기본적으로 시스템의 나머지 부분에서 분리 되며 외부 레이아웃은이 경계를 넘어갈 수 없습니다.However, the root UIElement is essentially isolated from the rest of the system: styles, and external layout can't permeate this boundary. 루트의 크기를 명시적으로 지정 해야 하므로 UIElement만 부모 이기 때문은 VisualBrush 하므로 해당 수 없습니다. 자동으로 크기가 조정 자체 그려지는 영역 및 합니다.Therefore, you should explicitly specify the size of the root UIElement, because its only parent is the VisualBrush and therefore it cannot automatically size itself to the area being painted. WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF)의 레이아웃에 대한 자세한 내용은 레이아웃을 참조하세요.For more information about layout in WPF(Windows Presentation Foundation)Windows Presentation Foundation (WPF), see the Layout.

ImageBrush VisualBrush 와 마찬가지로는 해당 콘텐츠를 확장 하 여 해당 출력 영역을 채웁니다. DrawingBrushLike ImageBrush and DrawingBrush, a VisualBrush stretches its content to fill its output area. StretchFill기본 설정에서 속성을 변경 하 여이 동작을 재정의할 수 있습니다.You can override this behavior by changing the Stretch property from its default setting of Fill. 자세한 내용은 Stretch 속성을 참조하세요.For more information, see the Stretch property.

예제: 시각적 개체를 사용 하 여 개체 그리기Example: Paint an Object with a Visual

다음 예제에서는 여러 컨트롤과 패널을 사용해서 사각형을 그립니다.In the following example, several controls and a panel are used to paint a rectangle.

<Rectangle Width="150" Height="150" Stroke="Black" Margin="5,0,5,0">
  <Rectangle.Fill>
    <VisualBrush>
      <VisualBrush.Visual>
        <StackPanel Background="White">
          <Rectangle Width="25" Height="25" Fill="Red" Margin="2" />
          <TextBlock FontSize="10pt" Margin="2">Hello, World!</TextBlock>
          <Button Margin="2">A Button</Button>
        </StackPanel>
      </VisualBrush.Visual>
    </VisualBrush>
  </Rectangle.Fill>
</Rectangle>
VisualBrush myVisualBrush = new VisualBrush();

// Create the visual brush's contents.
StackPanel myStackPanel = new StackPanel();
myStackPanel.Background = Brushes.White;

Rectangle redRectangle = new Rectangle();
redRectangle.Width = 25;
redRectangle.Height =25; 
redRectangle.Fill = Brushes.Red;
redRectangle.Margin = new Thickness(2);
myStackPanel.Children.Add(redRectangle);

TextBlock someText = new TextBlock();
FontSizeConverter myFontSizeConverter = new FontSizeConverter();
someText.FontSize = (double)myFontSizeConverter.ConvertFrom("10pt");
someText.Text = "Hello, World!";
someText.Margin = new Thickness(2);
myStackPanel.Children.Add(someText);

Button aButton = new Button();
aButton.Content = "A Button";
aButton.Margin = new Thickness(2);
myStackPanel.Children.Add(aButton);

// Use myStackPanel as myVisualBrush's content.
myVisualBrush.Visual = myStackPanel;

// Create a rectangle to paint.
Rectangle myRectangle = new Rectangle();
myRectangle.Width = 150;
myRectangle.Height = 150;
myRectangle.Stroke = Brushes.Black;
myRectangle.Margin = new Thickness(5,0,5,0);

// Use myVisualBrush to paint myRectangle.
myRectangle.Fill = myVisualBrush;

Dim myVisualBrush As New VisualBrush()

' Create the visual brush's contents.
Dim myStackPanel As New StackPanel()
myStackPanel.Background = Brushes.White

Dim redRectangle As New Rectangle()
With redRectangle
    .Width = 25
    .Height = 25
    .Fill = Brushes.Red
    .Margin = New Thickness(2)
End With
myStackPanel.Children.Add(redRectangle)

Dim someText As New TextBlock()
Dim myFontSizeConverter As New FontSizeConverter()
someText.FontSize = CDbl(myFontSizeConverter.ConvertFrom("10pt"))
someText.Text = "Hello, World!"
someText.Margin = New Thickness(2)
myStackPanel.Children.Add(someText)

Dim aButton As New Button()
aButton.Content = "A Button"
aButton.Margin = New Thickness(2)
myStackPanel.Children.Add(aButton)

' Use myStackPanel as myVisualBrush's content.
myVisualBrush.Visual = myStackPanel

' Create a rectangle to paint.
Dim myRectangle As New Rectangle()
With myRectangle
    .Width = 150
    .Height = 150
    .Stroke = Brushes.Black
    .Margin = New Thickness(5, 0, 5, 0)
End With

' Use myVisualBrush to paint myRectangle.
myRectangle.Fill = myVisualBrush

예제: 리플렉션 만들기Example: Create a Reflection

앞의 예제에서는 배경으로 사용할 새 Visual 를 만드는 방법을 살펴보았습니다.The preceding example showed how to create a new Visual for use as a background. VisualBrush 사용 하 여 기존 시각적 개체를 표시할 수도 있습니다 .이 기능을 사용 하면 반사 및 확대와 같은 흥미로운 시각적 효과를 얻을 수 있습니다.You can also use a VisualBrush to display an existing visual; this capability enables you to produce interesting visual effects, such as reflections and magnification. 다음 예제에서는를 VisualBrush 사용 하 여 여러 요소를 포함 Border 하는의 리플렉션을 만듭니다.The following example uses a VisualBrush to create a reflection of a Border that contains several elements. 다음 그림에서는 이 예제가 생성하는 출력을 보여 줍니다.The following illustration shows the output that this example produces.

![반영 된 시각적 개체] 입니다. (./media/graphicsmm-visualbrush-reflection-small.jpg "graphicsmm_visualbrush_reflection_small")A reflected Visual object
반사된 표시 개체A reflected Visual object

using System;
using System.Windows;
using System.Windows.Data;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.IO;
using System.Collections.ObjectModel;
using System.Windows.Shapes;
namespace SDKSample
{
    public partial class ReflectionExample : Page
    {
        public ReflectionExample()
        {
            // Create a name scope for the page.
            NameScope.SetNameScope(this, new NameScope());

            this.Background = Brushes.Black;
            StackPanel myStackPanel = new StackPanel();
            myStackPanel.Margin = new Thickness(50);

            Border myReflectedBorder = new Border();
            this.RegisterName("ReflectedVisual", myReflectedBorder);

            // Create a gradient background for the border.
            GradientStop firstStop = new GradientStop();
            firstStop.Offset = 0.0;
            Color firstStopColor = new Color();
            firstStopColor.R = 204;
            firstStopColor.G = 204;
            firstStopColor.B = 255;
            firstStopColor.A = 255;
            firstStop.Color = firstStopColor;
            GradientStop secondStop = new GradientStop();
            secondStop.Offset = 1.0;
            secondStop.Color = Colors.White;

            GradientStopCollection myGradientStopCollection = new GradientStopCollection();
            myGradientStopCollection.Add(firstStop);
            myGradientStopCollection.Add(secondStop);

            LinearGradientBrush myLinearGradientBrush = new LinearGradientBrush();
            myLinearGradientBrush.StartPoint = new Point(0, 0.5);
            myLinearGradientBrush.EndPoint = new Point(1, 0.5);
            myLinearGradientBrush.GradientStops = myGradientStopCollection;

            myReflectedBorder.Background = myLinearGradientBrush;

            // Add contents to the border.
            StackPanel borderStackPanel = new StackPanel();
            borderStackPanel.Orientation = Orientation.Horizontal;
            borderStackPanel.Margin = new Thickness(10);

            TextBlock myTextBlock = new TextBlock();
            myTextBlock.TextWrapping = TextWrapping.Wrap;
            myTextBlock.Width = 200;
            myTextBlock.Text = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit." +
                               " Suspendisse vel ante. Donec luctus tortor sit amet est." +
                               " Nullam pulvinar odio et wisi." +
                               " Pellentesque quis magna. Sed pellentesque." +
                               " Nulla euismod." +
                               "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.";

            borderStackPanel.Children.Add(myTextBlock);

            StackPanel ellipseStackPanel = new StackPanel();

            Ellipse ellipse1 = new Ellipse();
            ellipse1.Margin = new Thickness(10);
            ellipse1.Height = 50;
            ellipse1.Width = 50;
            ellipse1.Fill = Brushes.Black;
            ellipseStackPanel.Children.Add(ellipse1);
            Ellipse ellipse2 = new Ellipse();
            ellipse2.Margin = new Thickness(10);
            ellipse2.Height = 50;
            ellipse2.Width = 50;
            ellipse2.Fill = Brushes.Black;
            ellipseStackPanel.Children.Add(ellipse2);
            Ellipse ellipse3 = new Ellipse();
            ellipse3.Margin = new Thickness(10);
            ellipse3.Height = 50;
            ellipse3.Width = 50;
            ellipse3.Fill = Brushes.Black;
            ellipseStackPanel.Children.Add(ellipse3);
            borderStackPanel.Children.Add(ellipseStackPanel);

            myReflectedBorder.Child = borderStackPanel;

            // Create divider rectangle
            Rectangle dividerRectangle = new Rectangle();
            dividerRectangle.Height = 1;
            dividerRectangle.Fill = Brushes.Gray;
            dividerRectangle.HorizontalAlignment = HorizontalAlignment.Stretch;

            // Create the object to contain the reflection.
            Rectangle reflectionRectangle = new Rectangle();

            // Bind the height of the rectangle to the border height.
            Binding heightBinding = new Binding();
            heightBinding.ElementName = "ReflectedVisual";
            heightBinding.Path = new PropertyPath(Rectangle.HeightProperty);
            BindingOperations.SetBinding(reflectionRectangle, Rectangle.HeightProperty, heightBinding);

            // Bind the width of the rectangle to the border width.
            Binding widthBinding = new Binding();
            widthBinding.ElementName = "ReflectedVisual";
            widthBinding.Path = new PropertyPath(Rectangle.WidthProperty);
            BindingOperations.SetBinding(reflectionRectangle, Rectangle.WidthProperty, widthBinding);

            // Creates the reflection.
            VisualBrush myVisualBrush = new VisualBrush();
            myVisualBrush.Opacity = 0.75;
            myVisualBrush.Stretch = Stretch.None;
            Binding reflectionBinding = new Binding();
            reflectionBinding.ElementName = "ReflectedVisual";
            BindingOperations.SetBinding(myVisualBrush, VisualBrush.VisualProperty, reflectionBinding);

            ScaleTransform myScaleTransform = new ScaleTransform();
            myScaleTransform.ScaleX = 1;
            myScaleTransform.ScaleY = -1;
            TranslateTransform myTranslateTransform = new TranslateTransform();
            myTranslateTransform.Y = 1;

            TransformGroup myTransformGroup = new TransformGroup();
            myTransformGroup.Children.Add(myScaleTransform);
            myTransformGroup.Children.Add(myTranslateTransform);

            myVisualBrush.RelativeTransform = myTransformGroup;

            reflectionRectangle.Fill = myVisualBrush;

            // Create a gradient background for the border.
            GradientStop firstStop2 = new GradientStop();
            firstStop2.Offset = 0.0;
            Color c1 = new Color();
            c1.R = 0;
            c1.G = 0;
            c1.B = 0;
            c1.A = 255;
            firstStop2.Color = c1;
            GradientStop secondStop2 = new GradientStop();
            secondStop2.Offset = 0.5;
            Color c2 = new Color();
            c2.R = 0;
            c2.G = 0;
            c2.B = 0;
            c2.A = 51;
            firstStop2.Color = c2;
            GradientStop thirdStop = new GradientStop();
            thirdStop.Offset = 0.75;
            Color c3 = new Color();
            c3.R = 0;
            c3.G = 0;
            c3.B = 0;
            c3.A = 0;
            thirdStop.Color = c3;

            GradientStopCollection myGradientStopCollection2 = new GradientStopCollection();
            myGradientStopCollection2.Add(firstStop2);
            myGradientStopCollection2.Add(secondStop2);
            myGradientStopCollection2.Add(thirdStop);

            LinearGradientBrush myLinearGradientBrush2 = new LinearGradientBrush();
            myLinearGradientBrush2.StartPoint = new Point(0.5, 0);
            myLinearGradientBrush2.EndPoint = new Point(0.5, 1);
            myLinearGradientBrush2.GradientStops = myGradientStopCollection2;

            reflectionRectangle.OpacityMask = myLinearGradientBrush2;

            BlurBitmapEffect myBlurBitmapEffect = new BlurBitmapEffect();
            myBlurBitmapEffect.Radius = 1.5;

            reflectionRectangle.BitmapEffect = myBlurBitmapEffect;

            myStackPanel.Children.Add(myReflectedBorder);
            myStackPanel.Children.Add(dividerRectangle);
            myStackPanel.Children.Add(reflectionRectangle);
            this.Content = myStackPanel;
        }
        /*
    <Rectangle 
      Height="{Binding Path=ActualHeight, ElementName=ReflectedVisual}" 
      Width="{Binding Path=ActualWidth, ElementName=ReflectedVisual}">

      <Rectangle.OpacityMask>
        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
          <GradientStop Color="#FF000000" Offset="0.0" />
          <GradientStop Color="#33000000" Offset="0.5" />
          <GradientStop Color="#00000000" Offset="0.75" />
        </LinearGradientBrush>
      </Rectangle.OpacityMask>

      <Rectangle.BitmapEffect>
        <BlurBitmapEffect Radius="1.5" />
      </Rectangle.BitmapEffect>
      
    </Rectangle>
  </StackPanel>
</Page>

*/
    }
}

Imports System.Windows
Imports System.Windows.Data
Imports System.Windows.Controls
Imports System.Windows.Media
Imports System.Windows.Media.Effects
Imports System.Windows.Media.Imaging
Imports System.IO
Imports System.Collections.ObjectModel
Imports System.Windows.Shapes
Namespace SDKSample
    Partial Public Class ReflectionExample
        Inherits Page
        Public Sub New()
            ' Create a name scope for the page.
            NameScope.SetNameScope(Me, New NameScope())

            Me.Background = Brushes.Black
            Dim myStackPanel As New StackPanel()
            myStackPanel.Margin = New Thickness(50)

            Dim myReflectedBorder As New Border()
            Me.RegisterName("ReflectedVisual", myReflectedBorder)

            ' Create a gradient background for the border.
            Dim firstStop As New GradientStop()
            firstStop.Offset = 0.0
            Dim firstStopColor As New Color()
            firstStopColor.R = 204
            firstStopColor.G = 204
            firstStopColor.B = 255
            firstStopColor.A = 255
            firstStop.Color = firstStopColor
            Dim secondStop As New GradientStop()
            secondStop.Offset = 1.0
            secondStop.Color = Colors.White

            Dim myGradientStopCollection As New GradientStopCollection()
            myGradientStopCollection.Add(firstStop)
            myGradientStopCollection.Add(secondStop)

            Dim myLinearGradientBrush As New LinearGradientBrush()
            myLinearGradientBrush.StartPoint = New Point(0, 0.5)
            myLinearGradientBrush.EndPoint = New Point(1, 0.5)
            myLinearGradientBrush.GradientStops = myGradientStopCollection

            myReflectedBorder.Background = myLinearGradientBrush

            ' Add contents to the border.
            Dim borderStackPanel As New StackPanel()
            borderStackPanel.Orientation = Orientation.Horizontal
            borderStackPanel.Margin = New Thickness(10)

            Dim myTextBlock As New TextBlock()
            myTextBlock.TextWrapping = TextWrapping.Wrap
            myTextBlock.Width = 200
            myTextBlock.Text = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit." & " Suspendisse vel ante. Donec luctus tortor sit amet est." & " Nullam pulvinar odio et wisi." & " Pellentesque quis magna. Sed pellentesque." & " Nulla euismod." & "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas."

            borderStackPanel.Children.Add(myTextBlock)

            Dim ellipseStackPanel As New StackPanel()

            Dim ellipse1 As New Ellipse()
            ellipse1.Margin = New Thickness(10)
            ellipse1.Height = 50
            ellipse1.Width = 50
            ellipse1.Fill = Brushes.Black
            ellipseStackPanel.Children.Add(ellipse1)
            Dim ellipse2 As New Ellipse()
            ellipse2.Margin = New Thickness(10)
            ellipse2.Height = 50
            ellipse2.Width = 50
            ellipse2.Fill = Brushes.Black
            ellipseStackPanel.Children.Add(ellipse2)
            Dim ellipse3 As New Ellipse()
            ellipse3.Margin = New Thickness(10)
            ellipse3.Height = 50
            ellipse3.Width = 50
            ellipse3.Fill = Brushes.Black
            ellipseStackPanel.Children.Add(ellipse3)
            borderStackPanel.Children.Add(ellipseStackPanel)

            myReflectedBorder.Child = borderStackPanel

            ' Create divider rectangle
            Dim dividerRectangle As New Rectangle()
            dividerRectangle.Height = 1
            dividerRectangle.Fill = Brushes.Gray
            dividerRectangle.HorizontalAlignment = HorizontalAlignment.Stretch

            ' Create the object to contain the reflection.
            Dim reflectionRectangle As New Rectangle()

            ' Bind the height of the rectangle to the border height.
            Dim heightBinding As New Binding()
            heightBinding.ElementName = "ReflectedVisual"
            heightBinding.Path = New PropertyPath(Rectangle.HeightProperty)
            BindingOperations.SetBinding(reflectionRectangle, Rectangle.HeightProperty, heightBinding)

            ' Bind the width of the rectangle to the border width.
            Dim widthBinding As New Binding()
            widthBinding.ElementName = "ReflectedVisual"
            widthBinding.Path = New PropertyPath(Rectangle.WidthProperty)
            BindingOperations.SetBinding(reflectionRectangle, Rectangle.WidthProperty, widthBinding)

            ' Creates the reflection.
            Dim myVisualBrush As New VisualBrush()
            myVisualBrush.Opacity = 0.75
            myVisualBrush.Stretch = Stretch.None
            Dim reflectionBinding As New Binding()
            reflectionBinding.ElementName = "ReflectedVisual"
            BindingOperations.SetBinding(myVisualBrush, VisualBrush.VisualProperty, reflectionBinding)

            Dim myScaleTransform As New ScaleTransform()
            myScaleTransform.ScaleX = 1
            myScaleTransform.ScaleY = -1
            Dim myTranslateTransform As New TranslateTransform()
            myTranslateTransform.Y = 1

            Dim myTransformGroup As New TransformGroup()
            myTransformGroup.Children.Add(myScaleTransform)
            myTransformGroup.Children.Add(myTranslateTransform)

            myVisualBrush.RelativeTransform = myTransformGroup

            reflectionRectangle.Fill = myVisualBrush

            ' Create a gradient background for the border.
            Dim firstStop2 As New GradientStop()
            firstStop2.Offset = 0.0
            Dim c1 As New Color()
            c1.R = 0
            c1.G = 0
            c1.B = 0
            c1.A = 255
            firstStop2.Color = c1
            Dim secondStop2 As New GradientStop()
            secondStop2.Offset = 0.5
            Dim c2 As New Color()
            c2.R = 0
            c2.G = 0
            c2.B = 0
            c2.A = 51
            firstStop2.Color = c2
            Dim thirdStop As New GradientStop()
            thirdStop.Offset = 0.75
            Dim c3 As New Color()
            c3.R = 0
            c3.G = 0
            c3.B = 0
            c3.A = 0
            thirdStop.Color = c3

            Dim myGradientStopCollection2 As New GradientStopCollection()
            myGradientStopCollection2.Add(firstStop2)
            myGradientStopCollection2.Add(secondStop2)
            myGradientStopCollection2.Add(thirdStop)

            Dim myLinearGradientBrush2 As New LinearGradientBrush()
            myLinearGradientBrush2.StartPoint = New Point(0.5, 0)
            myLinearGradientBrush2.EndPoint = New Point(0.5, 1)
            myLinearGradientBrush2.GradientStops = myGradientStopCollection2

            reflectionRectangle.OpacityMask = myLinearGradientBrush2

            Dim myBlurBitmapEffect As New BlurBitmapEffect()
            myBlurBitmapEffect.Radius = 1.5

            reflectionRectangle.BitmapEffect = myBlurBitmapEffect

            myStackPanel.Children.Add(myReflectedBorder)
            myStackPanel.Children.Add(dividerRectangle)
            myStackPanel.Children.Add(reflectionRectangle)
            Me.Content = myStackPanel

        End Sub
    End Class
End Namespace
<Page  
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
  Background="Black">


  <StackPanel Margin="50">

    <!-- The object to reflect. -->
    <Border Name="ReflectedVisual" Width="400">
      <Border.Background>
        <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
          <GradientStop Offset="0.0" Color="#CCCCFF" />
          <GradientStop Offset="1.0" Color="White" />
        </LinearGradientBrush>
      </Border.Background>
      <StackPanel Orientation="Horizontal" Margin="10">        
        <TextBlock TextWrapping="Wrap" Width="200" Margin="10">
          Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
          Suspendisse vel ante. Donec luctus tortor sit amet est.
          Nullam pulvinar odio et wisi.
          Pellentesque quis magna. Sed pellentesque.
          Nulla euismod.
          Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
        </TextBlock>
        <StackPanel>
          <Ellipse Margin="10" Height="50" Width="50" Fill="Black" />
          <Ellipse Margin="10" Height="50" Width="50" Fill="Black" />
          <Ellipse Margin="10" Height="50" Width="50" Fill="Black" />
        </StackPanel>
      </StackPanel>
    </Border>

    <Rectangle Height="1" Fill="Gray" HorizontalAlignment="Stretch" />

    <!-- The object to contain the reflection.-->
    <Rectangle 
      Height="{Binding Path=ActualHeight, ElementName=ReflectedVisual}" 
      Width="{Binding Path=ActualWidth, ElementName=ReflectedVisual}">
      <Rectangle.Fill>

        <!-- Creates the reflection. -->
        <VisualBrush 
          Opacity="0.75" Stretch="None"
          Visual="{Binding ElementName=ReflectedVisual}">
          <VisualBrush.RelativeTransform>

            <!-- Flip the reflection. -->
            <TransformGroup>
              <ScaleTransform ScaleX="1" ScaleY="-1" />
              <TranslateTransform  Y="1" />
            </TransformGroup>
          </VisualBrush.RelativeTransform>
        </VisualBrush>
      </Rectangle.Fill>

      <Rectangle.OpacityMask>
        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
          <GradientStop Color="#FF000000" Offset="0.0" />
          <GradientStop Color="#33000000" Offset="0.5" />
          <GradientStop Color="#00000000" Offset="0.75" />
        </LinearGradientBrush>
      </Rectangle.OpacityMask>

      <Rectangle.BitmapEffect>
        <BlurBitmapEffect Radius="1.5" />
      </Rectangle.BitmapEffect>
      
    </Rectangle>
  </StackPanel>
</Page>

화면의 일부를 확대하는 방법 및 리플렉션을 만드는 방법을 보여 주는 추가 예제를 보려면 VisualBrush 샘플을 참조하세요.For additional examples that show how to magnify portions of the screen and how to create reflections, see the VisualBrush Sample.

TileBrush 기능TileBrush Features

ImageBrush, DrawingBrush TileBrushVisualBrush 는 개체의 형식입니다.ImageBrush, DrawingBrush, and VisualBrush are types of TileBrush objects. TileBrush개체를 사용 하면 이미지, 그리기 또는 시각적 개체를 사용 하 여 영역을 그리는 방법을 다양 하 게 제어할 수 있습니다.TileBrush objects provide you with a great deal of control over how an area is painted with an image, drawing, or visual. 예를 들어 늘어난 이미지만으로 영역을 그리기보다, 패턴을 만드는 일련의 이미지 타일을 사용하여 영역을 그릴 수 있습니다.For example, instead of just painting an area with a single stretched image, you can paint an area with a series of image tiles that create a pattern.

TileBrush 는 세 가지 주요 구성 요소인 콘텐츠, 타일 및 출력 영역이 있습니다.A TileBrush has three primary components: content, tiles, and the output area.

TileBrush 구성 요소TileBrush components
단일 타일이 있는 TileBrush의 구성 요소Components of a TileBrush with a single tile

바둑판식으로 배열 된 TileBrush의 구성 요소Components of a tiled TileBrush
여러 타일이 있는 TileBrush의 구성 요소Components of a TileBrush with multiple tiles

개체의 TileBrush 바둑판식 배열 기능에 대 한 자세한 내용은 TileBrush 개요를 참조 하세요.For more information about the tiling features of TileBrush objects, see the TileBrush Overview.

참고자료See also