مشاركة عبر


استخدام كائنات DrawingVisual

يوفر هذا الموضوع نظرة عامة حول كيفية استخدام كائنات DrawingVisual في طبقة WPF المرئية.

يشتمل هذا الموضوع على الأقسام التالية.

  • رسم كائن مرئي

  • حاوية المضيف DrawingVisual

  • إنشاء كائنات DrawingVisual

  • إنشاء تجاوزات لأعضاء FrameworkElement

  • توفير دعم اختبار الإصابة

  • مواضيع ذات صلة

كائن 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
        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
// 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);
    }
ملاحظةملاحظة

للحصول على نموذج التعليمات البرمجية كاملة الذى تم أخذ مثال التعليمات البرمجية السابق منه ، راجع مرات الاصابة استخدام نموذج DrawingVisuals.

إنشاء كائنات DrawingVisual

عند إنشاء كائن DrawingVisual لا يحتوي على محتوى رسم. يمكنك إضافة نص أو رسومات أو محتوى الصورة بواسطة استرداد DrawingContext الخاصة بالكائن و الرسم بداخله. يتم استرجاع DrawingContextعن طريق استدعاء أسلوب RenderOpen لكائن DrawingVisual.

لرسم مستطيل في DrawingContext، استخدم أسلوب DrawRectangle لكائن DrawingContext. هناك أساليب مشابهة لرسم أنواع أخرى من المحتوى. عند الانتهاء من رسم المحتوى في DrawingContext ، قم باستدعاء أسلوب Close لإغلاق DrawingContext و الحفاظ على المحتوى.

في المثال التالي يتم إنشاء كائن DrawingVisual و يتم رسم مستطيل بداخل DrawingContext الخاص به.

        ' 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
// 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;
}

إنشاء تجاوزات لأعضاء FrameworkElement

كائن حاوية المضيف مسؤول عن إدارة مجموعة من الكائنات المرئية. يتطلب ذلك أن تقوم حاوية المضيف بتنفيذ تجاوزات عضو لفئة FrameworkElement المشتقة.

تصف القائمة التالية عضوين يجب تجاوزهما:

  • GetVisualChild: يقوم بإرجاع تابع في الفهرس المحدد من مجموعة العناصر التابعة.

  • VisualChildrenCount: يقوم بالحصول على عدد العناصر المرئية التابعة ضمن هذا العنصر.

في المثال التالي، يتم تطبيق تجاوز لعضوي FrameworkElement.


        ' 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


        // 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];
        }

توفير دعم اختبار الإصابة

يمكن أن يوفر كائن حاوية المضيف معالجة الحدث حتى إذا لم يتم عرض أية خصائص مرئية — على الرغم من ذلك، خاصية Visibility التابعة له يجب أن تعين إلى Visible. يتيح لك ذلك إنشاء روتين معالجة الحدث لحاوية المضيف التي يمكنها اعتراض أحداث الماوس مثل تحرير زر الماوس الأيسر. ثم يمكن لروتين معالجة الحدث تطبيق اختبار الإصابة بواسطة استدعاء أسلوب HitTest. تشير معلمة HitTestResultCallback التابعة إلى الأسلوب لإجراء معرف من قبل المستخدم الذي يمكن استخدامه لتحديد الإجراء الناتج من اختبار الإصابة.

في المثال التالي، يتم تطبيق دعم اختبار الإصابة لكائن حاوية المضيف و توابعه.

        ' 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)
            ' Retreive 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
// 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)
{
    // Retreive 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;
}

راجع أيضًا:

المرجع

DrawingVisual

HitTest

المبادئ

نظرة عامة حول تقديم رسومات WPF

اختبار الدخول إلى الطبقة المرئية