2009-02-03 8 views
5

Các điều khiển xem tài liệu WPF hỗ trợ các chú thích bao gồm FlowDocumentReader và FlowDocumentScrollViewer, cũng như các điều khiển được lấy từ DocumentViewerBase như DocumentViewer và FlowDocumentPageViewer.Làm cách nào để cho phép người dùng thêm chú thích vào các điều khiển giao diện người dùng trong WPF?

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

tôi đã tự hỏi làm thế nào nó sẽ có thể để thêm các chức năng để WPF điều khiển phổ biến như Button, TextBox, các mục ListBox, vv Ý tưởng là để cho phép người sử dụng để vượt qua trên một số ý kiến ​​trên màn hình giao diện người dùng, cho người dùng khác.

Điều đầu tiên cần lưu ý là kế thừa từ DocumentViewerBase và tạo các điều khiển tùy chỉnh của riêng bạn. Tôi không chắc chắn về cách nó sẽ làm việc ra. Điều gì xảy ra nếu các điều khiển không phải tùy chỉnh cần được chú thích?

Có ai đã từng làm việc hoặc thấy loại tính năng này không?

Mọi chỉ đường đều hữu ích.

Trả lời

5

Hmmm. Tôi có lẽ sẽ làm điều này với một 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 

Và sau đó bạn sẽ sử dụng nó bằng cách:

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 

tôi sẽ để lại cho bạn để điều chỉnh vị trí và sự xuất hiện thực tế của các chú thích, nhưng bạn sẽ có được Ý tưởng. Điều này sẽ hoạt động cho bất kỳ UIElement nào, bao gồm cả các điều khiển tùy chỉnh.

Đây là một câu trả lời tắt dựa trên một số công việc khác tôi đã làm với Adorners. Đoạn mã trên có thể hoặc không thể biên dịch được. Tôi không cung cấp cách chỉnh sửa chú thích, nhưng bạn có thể thực hiện điều đó một cách dễ dàng bằng cách xóa dòng "Me.IsHitTestVisible = False" và xử lý các sự kiện MouseUp trong adorner.

+0

Vì vậy, không ra khỏi hộp Chú thích như DocumentViewer có thể được cung cấp cho các điều khiển, bạn nghĩ sao? Cảm ơn lời giải thích và đoạn mã đó, Hãy để tôi thử chạy điều này và xem tôi có thể nhận được nó hay không. – Vin

+0

Tôi không thể nghĩ đến việc sử dụng Chú thích hiện có trong hộp, bởi vì bạn cần một cái gì đó hoạt động với UIElement, vì đó là (và đó là các lớp con) gần như hoàn toàn dành cho việc phát triển giao diện người dùng thông thường. Có thể có một số dự án của bên thứ ba, nhưng tôi không biết về nó. –