2009-02-03 10 views
5

I controlli di visualizzazione dei documenti WPF che supportano le annotazioni includono FlowDocumentReader e FlowDocumentScrollViewer, nonché i controlli derivati ​​da DocumentViewerBase come DocumentViewer e FlowDocumentPageViewer.Come consentire all'utente di aggiungere annotazioni ai controlli dell'interfaccia utente in WPF?

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

mi chiedevo come sarebbe possibile aggiungere la funzionalità per controlli comuni WPF come Button, TextBox, elementi ListBox ecc Idea è quella di consentire all'utente di trasmettere alcuni commenti sullo schermo dell'interfaccia utente, a un altro utente.

La prima cosa che viene in mente è ereditare da DocumentViewerBase e creare i propri controlli personalizzati. Non sono sicuro di come andrebbe a finire. Che cosa succede se i controlli non personalizzati devono essere annotati?

Qualcuno ha funzionato o visto questo tipo di funzionalità?

Qualsiasi indicazione sarebbe utile.

risposta

5

Hmmm. Io probabilmente fare questo con una 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 

E poi lo uso da:

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 

Vi lascio per regolare la posizione e l'aspetto reale dell'annotazione, ma si ottiene l'idea. Ciò funzionerà per qualsiasi UItemento, inclusi i controlli personalizzati.

Questa è stata una risposta inoffensiva basata su qualche altro lavoro che avevo fatto con Adorners. Sopra il codice può o non può essere compilato. Non ho fornito un modo per modificare le annotazioni, ma puoi farlo facilmente rimuovendo la riga "Me.IsHitTestVisible = False" e gestendo gli eventi MouseUp nell'ornatore.

+0

Quindi non è possibile aggiungere annotazioni come DocumentViewer ai controlli, secondo voi? Grazie per la spiegazione e lo snippet di codice, permettetemi di eseguire questo e vedere se riesco a ottenerlo. – Vin

+0

Non riesco a pensare a usare le annotazioni esistenti, perché avresti bisogno di qualcosa che funzioni con UIElement, dal momento che è (ed è sottoclassi) quasi esclusivamente ciò di cui ti occupi nello sviluppo dell'interfaccia utente regolare. Potrebbero esserci progetti di terze parti, ma non ne sono a conoscenza. –

Problemi correlati