2009-02-03 7 views
5

WPF Anzeige von Dokumenten Steuerelemente, die Anmerkungen und unterstützen umfassen Flowdocumentreader Flowdocumentscrollviewer sowie Steuerelemente aus DocumentViewerBase wie Document und Flowdocumentpageviewer abgeleitet.Wie kann der Benutzer Anmerkungen zu UI-Steuerelementen in WPF hinzufügen?

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

Ich habe mich gefragt, wie es möglich wäre, die Funktionalität zu WPF allgemeinen Steuerelemente wie Button, TextBox, ListBox Elemente usw. Idee ist hinzuzufügen, damit der Benutzer auf einige Kommentare auf dem UI-Bildschirm passieren, an einen anderen Benutzer.

Das erste, was in den Sinn kommt, ist aus dem DocumentViewerBase und erstellen Sie Ihre eigene benutzerdefinierte Steuerelemente erben. Ich bin mir nicht sicher, wie es funktionieren würde. Was ist, wenn nicht benutzerdefinierte Steuerelemente kommentiert werden müssen?

Hat jemand gearbeitet oder diese Art von Funktion gesehen?

Alle Richtungen wäre hilfreich.

Antwort

5

Hmmm. Ich würde dies wahrscheinlich tun mit einem 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 

Und dann würden Sie es verwenden von:

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 

Ich werde dich verlassen, die Position und das tatsächliche Aussehen der Anmerkung zu justieren, aber Sie bekommen die Idee. Dies funktioniert für beliebige UIElement, einschließlich benutzerdefinierter Steuerelemente.

Dies war ein aus dem Stehgreif Antwort auf eine andere Arbeit basieren ich mit Adorner getan hatte. Der obige Code kann kompiliert werden oder auch nicht. Ich habe keine Möglichkeit zur Bearbeitung von Anmerkungen zur Verfügung gestellt, aber Sie können dies einfach tun, indem Sie die Zeile "Me.IsHitTestVisible = False" entfernen und MouseUp-Ereignisse im Adorner behandeln.

+0

Also nicht aus dem Feld Anmerkungen wie Document zu Kontrollen zur Verfügung gestellt werden kann, denken Sie? Danke für diese Erklärung und Code-Schnipsel, lass mich versuchen, dies zu laufen und sehen, ob ich es bekommen kann. – Vin

+0

Ich kann nicht wegdenken, um vorhandene Anmerkungen aus der Box zu verwenden, weil Sie etwas benötigen, das mit UIElement funktioniert, da dies (und seine Unterklassen) fast ausschließlich das ist, was Sie in der normalen UI-Entwicklung behandeln. Vielleicht gibt es ein Projekt von einem Dritten, aber ich bin mir dessen nicht bewusst. –