DrawingVisual 개체 사용

이 항목에서는 시각적 계층에서 개체를 사용 하는 방법에 대 한 개요를 제공 DrawingVisual WPF 합니다.

DrawingVisual 개체

DrawingVisual 도형, 이미지 또는 텍스트를 렌더링 하는 데 사용 되는 간단한 그리기 클래스입니다. 이 클래스는 성능을 향상시키는 레이아웃이나 이벤트 처리를 제공하지 않으므로 간단한 클래스로 간주됩니다. 이러한 이유 때문에 그리기는 배경 및 클립 아트에 적합합니다.

DrawingVisual 호스트 컨테이너

사용 하기 위해 DrawingVisual 개체를 개체에 대 한 호스트 컨테이너를 만들어야 합니다. 호스트 컨테이너 개체는 클래스에서 파생 되어야 합니다. 클래스는 FrameworkElement 클래스의 레이아웃 및 이벤트 처리 지원을 제공 합니다 DrawingVisual . 호스트 컨테이너 개체는 주 목적이 자식 개체를 포함하는 것이므로 표시 가능한 속성을 표시하지 않습니다. 그러나 Visibility 호스트 컨테이너의 속성을로 설정 해야 합니다. Visible 그렇지 않으면 자식 요소가 표시 되지 않습니다.

시각적 개체에 대 한 호스트 컨테이너 개체를 만드는 경우 시각적 개체 참조를에 저장 해야 VisualCollection 합니다. 메서드를 사용 Add 하 여 호스트 컨테이너에 시각적 개체를 추가 합니다. 다음 예제에서는 호스트 컨테이너 개체가 만들어지고 세 개의 시각적 개체가에 추가 됩니다 VisualCollection .

// Create a host visual derived from the FrameworkElement class.
// This class provides layout, event handling, and container support for
// the child visual objects.
public class MyVisualHost : FrameworkElement
{
    // Create a collection of child visual objects.
    private VisualCollection _children;

    public MyVisualHost()
    {
        _children = new VisualCollection(this);
        _children.Add(CreateDrawingVisualRectangle());
        _children.Add(CreateDrawingVisualText());
        _children.Add(CreateDrawingVisualEllipses());

        // Add the event handler for MouseLeftButtonUp.
        this.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(MyVisualHost_MouseLeftButtonUp);
    }
' Create a host visual derived from the FrameworkElement class.
' This class provides layout, event handling, and container support for
' the child visual objects.
Public Class MyVisualHost
    Inherits FrameworkElement
    ' Create a collection of child visual objects.
    Private _children As VisualCollection

    Public Sub New()
        _children = New VisualCollection(Me)
        _children.Add(CreateDrawingVisualRectangle())
        _children.Add(CreateDrawingVisualText())
        _children.Add(CreateDrawingVisualEllipses())

        ' Add the event handler for MouseLeftButtonUp.
        AddHandler MouseLeftButtonUp, AddressOf MyVisualHost_MouseLeftButtonUp
    End Sub

참고

위의 코드 예제가 발췌된 전체 코드 샘플을 보려면 DrawingVisuals를 사용하여 적중 테스트 샘플을 참조하세요.

DrawingVisual 개체 만들기

만들 때를 DrawingVisual 개체를 그리기 내용이 없습니다. 개체의 및 그리기를 검색 하 여 텍스트, 그래픽 또는 이미지 콘텐츠를 추가할 수 있습니다 DrawingContext . DrawingContext개체의 메서드를 호출 하 여이 반환 됩니다 RenderOpen DrawingVisual .

에 사각형을 그리려면 DrawingContext DrawRectangle 개체의 메서드를 사용 DrawingContext 합니다. 다른 형식의 콘텐츠를 그리기 위한 비슷한 메서드가 존재합니다. 에 콘텐츠를 그리기를 마치면 메서드를 DrawingContext 호출 하 여 Close 를 닫고 DrawingContext 콘텐츠를 유지 합니다.

다음 예제에서는 DrawingVisual 개체가 만들어지고 사각형은로 그려집니다 DrawingContext .

// Create a DrawingVisual that contains a rectangle.
private DrawingVisual CreateDrawingVisualRectangle()
{
    DrawingVisual drawingVisual = new DrawingVisual();

    // Retrieve the DrawingContext in order to create new drawing content.
    DrawingContext drawingContext = drawingVisual.RenderOpen();

    // Create a rectangle and draw it in the DrawingContext.
    Rect rect = new Rect(new System.Windows.Point(160, 100), new System.Windows.Size(320, 80));
    drawingContext.DrawRectangle(System.Windows.Media.Brushes.LightBlue, (System.Windows.Media.Pen)null, rect);

    // Persist the drawing content.
    drawingContext.Close();

    return drawingVisual;
}
' Create a DrawingVisual that contains a rectangle.
Private Function CreateDrawingVisualRectangle() As DrawingVisual
    Dim drawingVisual As New DrawingVisual()

    ' Retrieve the DrawingContext in order to create new drawing content.
    Dim drawingContext As DrawingContext = drawingVisual.RenderOpen()

    ' Create a rectangle and draw it in the DrawingContext.
    Dim rect As New Rect(New Point(160, 100), New Size(320, 80))
    drawingContext.DrawRectangle(Brushes.LightBlue, CType(Nothing, Pen), rect)

    ' Persist the drawing content.
    drawingContext.Close()

    Return drawingVisual
End Function

FrameworkElement 멤버에 대한 재정의 만들기

호스트 컨테이너 개체는 시각적 개체의 컬렉션을 관리합니다. 이렇게 하려면 호스트 컨테이너가 파생 된 클래스에 대 한 멤버 재정의를 구현 해야 합니다 FrameworkElement .

다음 목록에서는 재정의해야 하는 두 멤버에 대해 설명합니다.

  • GetVisualChild: 자식 요소 컬렉션에서 지정 된 인덱스에 있는 자식을 반환 합니다.

  • VisualChildrenCount:이 요소 내 시각적 자식 요소의 수를 가져옵니다.

다음 예제에서는 두 멤버에 대 한 재정의가 FrameworkElement 구현 됩니다.


// Provide a required override for the VisualChildrenCount property.
protected override int VisualChildrenCount
{
    get { return _children.Count; }
}

// Provide a required override for the GetVisualChild method.
protected override Visual GetVisualChild(int index)
{
    if (index < 0 || index >= _children.Count)
    {
        throw new ArgumentOutOfRangeException();
    }

    return _children[index];
}


' Provide a required override for the VisualChildrenCount property.
Protected Overrides ReadOnly Property VisualChildrenCount() As Integer
    Get
        Return _children.Count
    End Get
End Property

' Provide a required override for the GetVisualChild method.
Protected Overrides Function GetVisualChild(ByVal index As Integer) As Visual
    If index < 0 OrElse index >= _children.Count Then
        Throw New ArgumentOutOfRangeException()
    End If

    Return _children(index)
End Function

적중 테스트 지원 제공

호스트 컨테이너 개체는 표시 되는 속성을 표시 하지 않는 경우에도 이벤트 처리를 제공할 수 있습니다 Visibility . 그러나 속성을로 설정 해야 합니다 Visible . 이 경우 왼쪽 마우스 단추 놓기와 같은 마우스 이벤트를 트래핑할 수 있는 호스트 컨테이너에 대한 이벤트 처리 루틴을 만들 수 있습니다. 그런 다음 이벤트 처리 루틴은 메서드를 호출 하 여 적중 테스트를 구현할 수 있습니다 HitTest . 메서드의 HitTestResultCallback 매개 변수는 적중 테스트의 결과 동작을 확인 하는 데 사용할 수 있는 사용자 정의 프로시저를 참조 합니다.

다음 예제에서는 호스트 컨테이너 개체 및 해당 자식에 대해 적중 테스트 지원이 구현됩니다.

// Capture the mouse event and hit test the coordinate point value against
// the child visual objects.
void MyVisualHost_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    // Retrieve the coordinates of the mouse button event.
    System.Windows.Point pt = e.GetPosition((UIElement)sender);

    // Initiate the hit test by setting up a hit test result callback method.
    VisualTreeHelper.HitTest(this, null, new HitTestResultCallback(myCallback), new PointHitTestParameters(pt));
}

// If a child visual object is hit, toggle its opacity to visually indicate a hit.
public HitTestResultBehavior myCallback(HitTestResult result)
{
    if (result.VisualHit.GetType() == typeof(DrawingVisual))
    {
        if (((DrawingVisual)result.VisualHit).Opacity == 1.0)
        {
            ((DrawingVisual)result.VisualHit).Opacity = 0.4;
        }
        else
        {
            ((DrawingVisual)result.VisualHit).Opacity = 1.0;
        }
    }

    // Stop the hit test enumeration of objects in the visual tree.
    return HitTestResultBehavior.Stop;
}
' Capture the mouse event and hit test the coordinate point value against
' the child visual objects.
Private Sub MyVisualHost_MouseLeftButtonUp(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
    ' Retrieve the coordinates of the mouse button event.
    Dim pt As Point = e.GetPosition(CType(sender, UIElement))

    ' Initiate the hit test by setting up a hit test result callback method.
    VisualTreeHelper.HitTest(Me, Nothing, New HitTestResultCallback(AddressOf myCallback), New PointHitTestParameters(pt))
End Sub

' If a child visual object is hit, toggle its opacity to visually indicate a hit.
Public Function myCallback(ByVal result As HitTestResult) As HitTestResultBehavior
    If result.VisualHit.GetType() Is GetType(DrawingVisual) Then
        If (CType(result.VisualHit, DrawingVisual)).Opacity = 1.0 Then
            CType(result.VisualHit, DrawingVisual).Opacity = 0.4
        Else
            CType(result.VisualHit, DrawingVisual).Opacity = 1.0
        End If
    End If

    ' Stop the hit test enumeration of objects in the visual tree.
    Return HitTestResultBehavior.Stop
End Function

참고 항목