【问题标题】:How to allow the user to add annotations to UI controls in WPF?如何允许用户在 WPF 中向 UI 控件添加注释?
【发布时间】:2010-10-05 04:14:21
【问题描述】:

支持注解的 WPF 文档查看控件包括 FlowDocumentReader 和 FlowDocumentScrollViewer,以及从 DocumentViewerBase 派生的控件,如 DocumentViewer 和 FlowDocumentPageViewer。

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

我想知道如何将功能添加到 WPF 常用控件(如 Button、TextBox、ListBox 项等)。想法是允许用户将 UI 屏幕上的一些 cmets 传递给另一个用户。

首先想到的是从 DocumentViewerBase 继承并创建您自己的自定义控件。我不确定它会如何运作。如果非自定义控件需要注解怎么办?

有没有人用过或见过这种功能?

任何方向都会有所帮助。

【问题讨论】:

    标签: .net wpf xaml controls annotations


    【解决方案1】:

    嗯。我可能会使用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 事件来轻松做到这一点。

    【讨论】:

    • 所以没有开箱即用的注释像 DocumentViewer 可以提供给控件,你认为吗?感谢您的解释和代码 sn-p,让我尝试运行它,看看是否可以得到它。
    • 我想不出开箱即用现有的注释,因为你需要一些可以与 UIElement 一起使用的东西,因为那(和它的子类)几乎完全是你在常规中处理的用户界面开发。可能有一些第三方项目,但我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2011-07-27
    • 2011-01-04
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多