DrawingVisual Nesnelerini Kullanma

Bu konu başlığında WPF görsel katmanındaki nesnelerin nasıl kullanılacağına DrawingVisual ilişkin bir genel bakış sağlanır.

DrawingVisual Nesnesi

, DrawingVisual şekilleri, resimleri veya metinleri işlemek için kullanılan basit bir çizim sınıfıdır. Bu sınıf, performansını geliştiren düzen veya olay işleme sağlamadığından basit olarak kabul edilir. Bu nedenle çizimler arka planlar ve küçük resimler için idealdir.

DrawingVisual Konak Kapsayıcısı

Nesneleri kullanmak DrawingVisual için nesneler için bir konak kapsayıcısı oluşturmanız gerekir. Konak kapsayıcı nesnesi sınıfından FrameworkElement türetilmelidir; bu, sınıfın eksik olduğu DrawingVisual düzen ve olay işleme desteği sağlar. Ana kapsayıcı nesnesi, ana amacı alt nesneleri içermek olduğundan görünür hiçbir özellik görüntülemez. Ancak, Visibility konak kapsayıcısının özelliği olarak Visibleayarlanmalıdır; aksi takdirde, alt öğelerinin hiçbiri görünmez.

Görsel nesneler için bir konak kapsayıcı nesnesi oluşturduğunuzda, görsel nesne başvurularını içinde VisualCollectiondepolamanız gerekir. Konak kapsayıcısına Add görsel bir nesne eklemek için yöntemini kullanın. Aşağıdaki örnekte bir konak kapsayıcı nesnesi oluşturulur ve nesnesine VisualCollectionüç görsel nesne eklenir.

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

Dekont

Yukarıdaki kod örneğinin ayıklandığı kod örneğinin tamamı için bkz . Çizim Kullanarak İsabet TestiVisuals Örneği.

DrawingVisual Nesneleri Oluşturma

Bir DrawingVisual nesne oluşturduğunuzda, nesnenin çizim içeriği yoktur. Nesnenin içeriğini DrawingContext alıp içine çizerek metin, grafik veya resim içeriği ekleyebilirsiniz. bir DrawingContext nesnesinin yöntemi DrawingVisual çağrılarak RenderOpen döndürülür.

içine DrawingContextbir dikdörtgen çizmek için nesnesinin DrawRectangleDrawingContext yöntemini kullanın. Diğer içerik türlerini çizmek için benzer yöntemler vardır. içine içerik DrawingContextçizmeyi bitirdiğinizde, öğesini kapatmak DrawingContext ve içeriği kalıcı hale getirmek için yöntemini çağırınClose.

Aşağıdaki örnekte bir DrawingVisual nesne oluşturulur ve içine DrawingContextbir dikdörtgen çizilir.

// 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 Üyeleri için Geçersiz Kılmalar Oluşturma

Konak kapsayıcı nesnesi, görsel nesne koleksiyonunu yönetmekle sorumludur. Bunun için konak kapsayıcısının türetilmiş FrameworkElement sınıf için üye geçersiz kılmaları uygulaması gerekir.

Aşağıdaki listede geçersiz kılmanız gereken iki üye açıklanmaktadır:

  • GetVisualChild: Alt öğeler koleksiyonundan belirtilen dizinde bir alt öğe döndürür.

  • VisualChildrenCount: Bu öğe içindeki görsel alt öğe sayısını alır.

Aşağıdaki örnekte, iki FrameworkElement üye için geçersiz kılmalar uygulanır.


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

İsabet Testi Desteği Sağlama

Konak kapsayıcı nesnesi, görünür hiçbir özellik görüntülemese bile olay işleme sağlayabilir; ancak özelliği Visibility olarak Visibleayarlanmalıdır. Bu, konak kapsayıcısı için sol fare düğmesinin serbest bırakılması gibi fare olaylarını tuzağa düşürebilen bir olay işleme yordamı oluşturmanıza olanak tanır. Olay işleme yordamı daha sonra yöntemini çağırarak HitTest isabet testi uygulayabilir. Yöntemin HitTestResultCallback parametresi, isabet testinin sonuç eylemini belirlemek için kullanabileceğiniz kullanıcı tanımlı bir yordama başvurur.

Aşağıdaki örnekte, ana bilgisayar kapsayıcı nesnesi ve alt öğeleri için isabet testi desteği uygulanır.

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

Ayrıca bkz.