DrawingVisual Nesnelerini Kullanma
Bu konu DrawingVisual , WPF Görsel katmanında nesnelerin nasıl kullanılacağına ilişkin bir genel bakış sağlar.
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ı artıran düzen veya olay işleme sağlamadığından hafif olarak değerlendirilir. Bu nedenle, çizimler arka planlar ve küçük resim için idealdir.
DrawingVisual ana bilgisayar kapsayıcısı
Nesneleri kullanmak için DrawingVisual , nesneler için bir konak kapsayıcısı oluşturmanız gerekir. Konak kapsayıcı nesnesi, FrameworkElement sınıfın eksik olduğu düzen ve olay işleme desteğini sağlayan sınıfından türetilmelidir DrawingVisual . Ana amacı alt nesneler içermesi gerektiğinden, konak kapsayıcı nesnesi hiçbir görünür özelliği görüntülemez. Ancak, Visibility konak kapsayıcısının özelliği olarak ayarlanmalıdır Visible ; Aksi takdirde, alt öğelerinden hiçbiri görünür olmayacaktır.
Görsel nesneler için bir konak kapsayıcı nesnesi oluşturduğunuzda, görsel nesne başvurularını bir olarak depolamanız gerekir VisualCollection . AddBir görsel nesneyi konak kapsayıcısına eklemek için yöntemini kullanın. Aşağıdaki örnekte, bir konak kapsayıcı nesnesi oluşturulur ve içine üç görsel nesne eklenir 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
Not
Yukarıdaki kod örneğinin ayıklandığı bütün kod örneği için bkz. Drawinggörselleri kullanarak Isabet testi örneği.
DrawingVisual nesneleri oluşturma
Bir DrawingVisual nesne oluşturduğunuzda, Çizim içeriğine sahip değildir. Nesne öğesini alarak ve içine çizerek metin, grafik veya resim içeriği ekleyebilirsiniz DrawingContext . Bir DrawingContextRenderOpen nesnesinin yöntemi çağırarak döndürülür DrawingVisual .
İçine bir dikdörtgen çizmek için DrawingContextDrawRectangle nesnesinin yöntemini kullanın DrawingContext . Diğer içerik türlerini çizmek için benzer yöntemler vardır. İçine içerik çizmeyi bitirdiğinizde, DrawingContext ' yi Close kapatıp içeriği kalıcı hale getirmek için yöntemini çağırın DrawingContext .
Aşağıdaki örnekte, bir DrawingVisual nesne oluşturulur ve içine bir dikdörtgen çizilir 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 üyeleri için geçersiz kılmalar oluşturma
Konak kapsayıcı nesnesi, kendi görsel nesne koleksiyonunu yönetmekten sorumludur. Bu, konak kapsayıcısının türetilmiş sınıf için üye geçersiz kılmalarını uygulamasını gerektirir FrameworkElement .
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 öğelerinin sayısını alır.
Aşağıdaki örnekte, iki üye için geçersiz kılmalar FrameworkElement 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
Isabet testi desteği sağlama
Konak kapsayıcı nesnesi herhangi bir görünür özellik görüntülemeseler bile olay işleme sağlayabilir, ancak Visibility özelliği olarak ayarlanmalıdır Visible . Bu, sol fare düğmesinin yayını gibi fare olaylarını yakalayabileceğiniz ana bilgisayar kapsayıcısı için bir olay işleme yordamı oluşturmanızı sağlar. Olay işleme yordamı daha sonra yöntemini çağırarak isabet sınamasını uygulayabilir HitTest . Yöntemin parametresi, HitTestResultCallback bir isabet testinin sonuç eylemini belirlemede kullanabileceğiniz Kullanıcı tanımlı bir yordama başvurur.
Aşağıdaki örnekte, ana bilgisayar kapsayıcısı 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