2009-02-03 10 views
5

Les contrôles d'affichage de document WPF qui prennent en charge les annotations incluent FlowDocumentReader et FlowDocumentScrollViewer, ainsi que les contrôles dérivés de DocumentViewerBase tels que DocumentViewer et FlowDocumentPageViewer.Comment autoriser l'utilisateur à ajouter des annotations aux contrôles de l'interface utilisateur dans WPF?

The in-built Annotations support for Document based controls is awesome in WPF

Je me demandais comment serait-il possible d'ajouter la fonctionnalité à WPF contrôles communs comme Button, TextBox, articles ListBox etc. L'idée est de permettre à l'utilisateur de transmettre des commentaires sur l'écran de l'interface utilisateur, à un autre utilisateur.

La première chose qui vient à l'esprit est d'hériter de DocumentViewerBase et de créer vos propres contrôles personnalisés. Je ne suis pas sûr de la façon dont cela fonctionnerait. Que faire si des contrôles non personnalisés doivent être annotés?

Est-ce que quelqu'un a travaillé ou vu ce genre de fonctionnalité?

Toutes les directions seraient utiles.

Répondre

5

Hmmm. Je serais probablement faire avec un adorner:

Imports System.Windows 
Imports System.Windows.Documents 
Imports System.Windows.Media 

Public Class Annotation 
    Inherits Adorner 

    Private _fill As Brush 
    Private _pen As Pen 
    Private _text As FormattedText 
    Private _annotationText as String 

    Public Sub New(ByVal adornedElement As UIElement, ByVal annotationText as String) 
     MyBase.New(adornedElement) 
     _annotationText = annotationText 
     _fill = New SolidColorBrush(Color.FromArgb(&H33, &HB0, &HC4, &HDE)) 
     _fill.Freeze() 
     _pen = New Pen(Brushes.LightSteelBlue, 3.0) 
     _pen.Freeze() 
     _text = New FormattedText(_annotationText, Globalization.CultureInfo.InvariantCulture, FlowDirection.LeftToRight, New Typeface("Verdana"), 11.0, Brushes.Black) 
     Me.IsHitTestVisible = False 
    End Sub 

    Protected Overrides Sub OnRender(ByVal drawingContext As DrawingContext) 
     MyBase.OnRender(drawingContext) 
     Dim adornedRect As New Rect(MyBase.AdornedElement.RenderSize) 
     drawingContext.DrawRectangle(_fill, _pen, adornedRect) 
     drawingContext.DrawText(_text, New Point(0,0)) 
    End Sub 

End Class 

Et vous utiliseriez par:

Private Sub AddAnnotation(ByVal uie As UIElement, ByVal annotationText as String) 
    Dim annotation = New Annotation(uie) 
    Dim adornerLayer = AdornerLayer.GetAdornerLayer(uie, annotationText) 
    adornerLayer.Add(annotation) 
End Sub 

Je vous laisse régler la position et l'apparence réelle de l'annotation, mais vous obtenez l'idée. Cela fonctionnera pour n'importe quel UIElement, y compris les contrôles personnalisés.

Ce fut une réponse spontanée basée sur un autre travail que j'avais fait avec Adorners. Au-dessus du code peut ou ne peut pas compiler. Je n'ai pas fourni un moyen de modifier les annotations, mais vous pouvez le faire facilement en supprimant la ligne "Me.IsHitTestVisible = False" et en gérant les événements MouseUp dans l'adorner.

+0

Donc pas prêt à l'emploi Des annotations comme DocumentViewer peuvent être mises à la disposition des commandes, pensez-vous? Merci pour cette explication et l'extrait de code, Laissez-moi essayer de lancer ceci et voir si je peux l'obtenir. – Vin

+0

Je ne peux pas penser à utiliser les annotations existantes, car vous auriez besoin de quelque chose qui fonctionne avec UIElement, puisque c'est (et ses sous-classes) presque exclusivement ce que vous avez à faire dans le développement de l'interface utilisateur. Il y a peut-être un projet de tiers, mais je ne le connais pas. –

Questions connexes