支持注释的WPF文档查看控件包括FlowDocumentReader和FlowDocumentScrollViewer,以及从DocumentViewerBase派生的控件,如DocumentViewer和FlowDocumentPageViewer。
The in-built Annotations support for Document based controls is awesome in WPF
我想知道如何将功能添加到WPF常用控件,如Button,TextBox,ListBox项等。想法是允许用户将UI屏幕上的一些注释传递给另一个用户。
首先想到的是继承DocumentViewerBase并创建自己的自定义控件。我不确定它会如何发挥作用。如果需要对非自定义控件进行注释会怎样?
有没有人工作或看过这种功能?
任何指示都会有所帮助。
答案 0 :(得分:5)
嗯。我可能会使用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事件来轻松完成。