2009-02-03 20 views
5

Los controles de visualización de documentos de WPF que admiten anotaciones incluyen FlowDocumentReader y FlowDocumentScrollViewer, así como controles derivados de DocumentViewerBase como DocumentViewer y FlowDocumentPageViewer.¿Cómo se permite al usuario agregar anotaciones a los controles de la interfaz de usuario en WPF?

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

Me preguntaba cómo sería posible añadir la funcionalidad de los controles comunes de WPF como Button, TextBox, ListBox artículos etc. idea es permitir al usuario pasar en algunos comentarios sobre la pantalla de interfaz de usuario, a otro usuario.

Lo primero que viene a la mente es heredar de DocumentViewerBase y crear sus propios controles personalizados. No estoy seguro de cómo saldría bien. ¿Qué pasa si los controles no personalizados deben ser anotados?

¿Alguien ha trabajado o visto este tipo de función?

Cualquier instrucción sería útil.

Respuesta

5

Hmmm. Yo probablemente hacer esto con 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 

Y entonces se usaría por:

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 

te dejaré para ajustar la posición y el aspecto real de la anotación, pero se obtiene la idea. Esto funcionará para cualquier UIElement, incluidos los controles personalizados.

Esta fue una respuesta indirecta basada en algún otro trabajo que había hecho con Adorners. El código anterior puede o no compilarse. No proporcioné una forma de editar anotaciones, pero puedes hacerlo fácilmente quitando la línea "Me.IsHitTestVisible = False" y manejando eventos MouseUp en el adorno.

+0

Por lo tanto, las anotaciones como DocumentViewer pueden estar disponibles para los controles, ¿no cree? Gracias por esa explicación y fragmento de código, déjame intentar ejecutar esto y ver si puedo obtenerlo. – Vin

+0

No puedo pensar en utilizar las Anotaciones existentes de fábrica, porque necesitaría algo que funcione con UIElement, ya que eso (y sus subclases) es casi exclusivamente lo que se maneja en el desarrollo de la IU habitual. Puede haber algún proyecto de un tercero, pero no lo conozco. –

Cuestiones relacionadas