Как разрешить пользователю добавлять аннотации к элементам управления пользовательского интерфейса в WPF? - PullRequest
5 голосов
/ 03 февраля 2009

Элементы управления для просмотра документов WPF, которые поддерживают аннотации, включают FlowDocumentReader и FlowDocumentScrollViewer, а также элементы управления, полученные из DocumentViewerBase, такие как DocumentViewer и FlowDocumentPageViewer.

Встроенная поддержка аннотаций для основанных на документе элементов управления великолепна в WPF

Мне было интересно, как можно было бы добавить функциональность к общим элементам управления WPF, таким как Button, TextBox, ListBox и т. Д. Идея состоит в том, чтобы позволить пользователю передавать некоторые комментарии на экране пользовательского интерфейса другому пользователю.

Первое, что приходит на ум, - это наследовать от DocumentViewerBase и создавать свои собственные пользовательские элементы управления. Я не уверен, как это сработает. Что если аннотированные элементы управления необходимо аннотировать?

Кто-нибудь работал или видел такую ​​функцию?

Любые указания будут полезны.

1 Ответ

5 голосов
/ 03 февраля 2009

Хммм. Я, вероятно, сделал бы это с 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

И тогда вы будете использовать его:

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

Я оставлю вас, чтобы отрегулировать положение и фактическое появление аннотации, но вы поняли идею. Это будет работать для любого UIElement, включая пользовательские элементы управления.

Это был неожиданный ответ, основанный на какой-то другой работе, которую я проделал с Adorners. Выше кода может или не может скомпилировать. Я не предоставил способ редактировать аннотации, но вы можете легко сделать это, удалив строку «Me.IsHitTestVisible = False» и обработав события MouseUp в панели управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...