Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a témakör áttekintést nyújt arról, hogyan használhat DrawingVisual objektumokat a WPF-vizualizációs rétegben.
DrawingVisual Objektum
A DrawingVisual egy egyszerű rajzosztály, amely alakzatok, képek vagy szövegek megjelenítésére szolgál. Ez az osztály egyszerűnek tekinthető, mert nem biztosít elrendezést vagy eseménykezelést, ami javítja a teljesítményét. Ezért a rajzok ideálisak hátterekhez és ClipArt-elemekhez.
DrawingVisual gazdatároló
Ahhoz, hogy DrawingVisual objektumokat használhasson, létre kell hoznia egy tárolóegységet az objektumokhoz. A gazdagéptároló-objektumnak a FrameworkElement osztályból kell származnia, amely támogatja az elrendezést és az eseménykezelést, amelyet a DrawingVisual osztály nem tartalmaz. A gazdagép konténer-objektum nem jelenít meg látható tulajdonságokat, mivel fő célja gyermekobjektumok tartalmazása. A gazda tároló Visibility tulajdonságát azonban Visible-re kell állítani, ellenkező esetben egyik gyermekelem sem lesz látható.
Amikor gazdatároló objektumot hoz létre vizuális objektumokhoz, a vizuális objektumok hivatkozásait egy VisualCollection-ban kell tárolnia. A Add metódussal vizuális objektumot adhat hozzá a gazdakonténerhez. Az alábbi példában egy gazdagép-konténer objektum jön létre, és három vizuális objektum kerül hozzáadásra a VisualCollection-hoz.
// 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
Megjegyzés:
A teljes kódmintát, ahonnan az előző kódpéldát származtatták, lásd: Hit Test Using DrawingVisuals Sample.
Rajzvizuális objektumok létrehozása
Ha DrawingVisual objektumot hoz létre, az nem tartalmaz rajztartalmat. Az objektum DrawingContext beolvasásával és a tartalom belerajzolásával szöveget, ábrát vagy képet adhat hozzá. A DrawingContext-t egy RenderOpen objektum DrawingVisual metódusának meghívásával kapjuk vissza.
Ha téglalapot szeretne rajzolni a DrawingContext, használja a DrawRectangle objektum DrawingContext metódusát. Hasonló módszerek léteznek más típusú tartalom rajzoláshoz. Ha befejezte a tartalom rajzolását a DrawingContext-ba, hívja meg a Close metódust a DrawingContext bezárásához és a tartalom elmentéséhez.
Az alábbi példában létrejön egy DrawingVisual objektum, és a DrawingContext-be rajzolnak egy téglalapot.
// 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
Felülbírálások létrehozása FrameworkElement-tagokhoz
A gazdagép konténerobjektuma felelős a vizuális objektumok gyűjteményének kezeléséért. Ehhez a gazdagépkonténernek implementálnia kell a tag függvények felülírását a származtatott FrameworkElement osztály számára.
Az alábbi lista azokat a két tagot ismerteti, amelyeket felülírni szükséges.
GetVisualChild: A gyermekelemek gyűjteményéből a megadott indexben lévő gyermeket adja vissza.
VisualChildrenCount: Lekéri az elemen belüli vizuális gyermekelemek számát.
Az alábbi példában a két FrameworkElement tagok felülbírálásait hajtjuk végre.
// 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
Találattesztelési támogatás biztosítása
A gazdagéptároló-objektum akkor is képes eseménykezelést biztosítani, ha nem jelenít meg látható tulajdonságokat – Visibility tulajdonságát azonban Visibleértékre kell állítani. Ez lehetővé teszi, hogy hozzon létre egy eseménykezelési rutint a gazdagéphez, amely képes az egéresemények kezelésére, például a bal egérgomb elengedésére. Az eseménykezelési rutin ezután a HitTest metódus meghívásával implementálhatja a találattesztelést. A metódus HitTestResultCallback paramétere egy felhasználó által meghatározott eljárásra hivatkozik, amellyel meghatározható egy találati teszt eredménye.
Az alábbi példában a találattesztelési támogatás implementálva van a gazdagép tárolóobjektumához és gyermekeihez.
// 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
Lásd még
.NET Desktop feedback