Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp vindt u een overzicht van het gebruik van DrawingVisual objecten in de WPF-visuallaag.
DrawingVisual-object
De DrawingVisual is een lichtgewicht tekenklasse die wordt gebruikt om vormen, afbeeldingen of tekst weer te geven. Deze klasse wordt als lichtgewicht beschouwd omdat deze geen indeling of gebeurtenisafhandeling biedt, waardoor de prestaties worden verbeterd. Daarom zijn tekeningen ideaal voor achtergronden en illustraties.
DrawingVisual Host-container
Als u DrawingVisual objecten wilt gebruiken, moet u een hostcontainer voor de objecten maken. Het hostcontainerobject moet zijn afgeleid van de FrameworkElement-klasse, die ondersteuning biedt voor de indeling en gebeurtenisafhandeling die de DrawingVisual klasse mist. Het hostcontainerobject geeft geen zichtbare eigenschappen weer, omdat het belangrijkste doel is om kinderobjecten te bevatten. De eigenschap Visibility van de hostcontainer moet echter worden ingesteld op Visible; anders is geen van de onderliggende elementen zichtbaar.
Wanneer u een hostcontainerobject voor visuele objecten maakt, moet u de verwijzingen naar het visuele object opslaan in een VisualCollection. Gebruik de methode Add om een visueel object toe te voegen aan de hostcontainer. In het volgende voorbeeld wordt een hostcontainerobject gemaakt en worden er drie visuele objecten toegevoegd aan de 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
Opmerking
Zie Hit Test Using DrawingVisuals Samplevoor het volledige codevoorbeeld waaruit het voorgaande codevoorbeeld is geëxtraheerd.
Het maken van DrawingVisual-objecten
Wanneer u een DrawingVisual-object maakt, heeft het geen tekeninhoud. U kunt tekst, afbeeldingen of afbeeldingsinhoud toevoegen door de DrawingContext van het object op te halen en erin te tekenen. Een DrawingContext wordt geretourneerd door de RenderOpen methode van een DrawingVisual-object aan te roepen.
Als u een rechthoek in de DrawingContextwilt tekenen, gebruikt u de DrawRectangle methode van het DrawingContext-object. Er bestaan vergelijkbare methoden voor het tekenen van andere typen inhoud. Wanneer u klaar bent met het tekenen van inhoud in de DrawingContext, roept u de methode Close aan om de DrawingContext te sluiten en de inhoud te behouden.
In het volgende voorbeeld wordt een DrawingVisual object gemaakt en wordt er een rechthoek getekend in de 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
Overschrijvingen maken voor FrameworkElement-leden
Het hostcontainerobject is verantwoordelijk voor het beheren van de verzameling visuele objecten. Hiervoor moet de hostcontainer lid-overrides implementeren voor de afgeleide FrameworkElement-klasse.
In de volgende lijst worden de twee leden beschreven die u moet overschrijven:
GetVisualChild: retourneert een onderliggend element op de opgegeven index uit de verzameling onderliggende elementen.
VisualChildrenCount: Haalt het aantal visuele kindelementen binnen dit element op.
In het volgende voorbeeld worden overschrijvingen voor de twee FrameworkElement-leden geïmplementeerd.
// 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
Ondersteuning bieden voor hittests
Het hostcontainerobject kan gebeurtenisafhandeling bieden, zelfs als er geen zichtbare eigenschappen worden weergegeven. De eigenschap Visibility moet echter worden ingesteld op Visible. Hiermee kunt u een routine voor het afhandelen van gebeurtenissen maken voor de hostcontainer waarmee muisacties kunnen worden onderschept, zoals het loslaten van de linkermuisknop. De gebeurtenisafhandelingsroutine kan vervolgens hittests implementeren door de HitTest methode aan te roepen. De HitTestResultCallback parameter van de methode verwijst naar een door de gebruiker gedefinieerde procedure die u kunt gebruiken om de resulterende actie van een hittest te bepalen.
In het volgende voorbeeld wordt hittestondersteuning geïmplementeerd voor het hostcontainerobject en de onderliggende objecten.
// 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
Zie ook
- DrawingVisual
- HitTest
- Overzicht van WPF Graphics Rendering
- Hit Testing in de visuele laag
.NET Desktop feedback