Поделиться через


Общие сведения об аннотациях

Написание заметок или комментариев на бумажных документах является такой распространенным действием, что мы почти принимаем его за это. Эти заметки или комментарии являются "заметками", которые мы добавляем в документ, чтобы пометить информацию или выделить элементы, интересующие их для последующей ссылки. Хотя написание заметок на печатных документах легко и обычно, возможность добавлять личные примечания к электронным документам обычно очень ограничена, если она доступна вообще.

В этом разделе рассматриваются несколько распространенных типов заметок, в частности прилипающие заметки и выделения, иллюстрирует, как Microsoft Notess Framework упрощает эти типы заметок в приложениях с помощью элементов управления просмотром документов Windows Presentation Foundation (WPF). Элементы управления просмотром документов WPF, поддерживающие заметки, включают FlowDocumentReader и FlowDocumentScrollViewer, а также элементы управления, производные от DocumentViewerBase, таких как DocumentViewer и FlowDocumentPageViewer.

Липкие заметки

Обычная прилипкая заметка содержит сведения, написанные на небольшой кусок цветной бумаги, который затем "застрял" в документе. Цифровые примечания предоставляют аналогичные функциональные возможности для электронных документов, но с добавленной гибкостью для включения многих других типов содержимого, таких как типизированный текст, рукописные заметки (например, рукописные штрихи пк планшета) или веб-ссылки.

На следующем рисунке показаны некоторые примеры выделения, липкой заметки с текстом и липкой рукописной заметки.

выделение, текст и чернильные примечания-стикеры.

В следующем примере показан метод, который можно использовать для включения поддержки заметок в приложении.

// ------------------------ StartAnnotations --------------------------
/// <summary>
///   Enables annotations and displays all that are viewable.</summary>
private void StartAnnotations()
{
    // If there is no AnnotationService yet, create one.
    if (_annotService == null)
        // docViewer is a document viewing control named in Window1.xaml.
        _annotService = new AnnotationService(docViewer);

    // If the AnnotationService is currently enabled, disable it.
    if (_annotService.IsEnabled == true)
        _annotService.Disable();

    // Open a stream to the file for storing annotations.
    _annotStream = new FileStream(
        _annotStorePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);

    // Create an AnnotationStore using the file stream.
    _annotStore = new XmlStreamStore(_annotStream);

    // Enable the AnnotationService using the new store.
    _annotService.Enable(_annotStore);
}// end:StartAnnotations()
' ------------------------ StartAnnotations --------------------------
''' <summary>
'''   Enables annotations and displays all that are viewable.</summary>
Private Sub StartAnnotations()
    ' If there is no AnnotationService yet, create one.
    If _annotService Is Nothing Then
        ' docViewer is a document viewing control named in Window1.xaml.
        _annotService = New AnnotationService(docViewer)
    End If

    ' If the AnnotationService is currently enabled, disable it.
    If _annotService.IsEnabled = True Then
        _annotService.Disable()
    End If

    ' Open a stream to the file for storing annotations.
    _annotStream = New FileStream(_annotStorePath, FileMode.OpenOrCreate, FileAccess.ReadWrite)

    ' Create an AnnotationStore using the file stream.
    _annotStore = New XmlStreamStore(_annotStream)

    ' Enable the AnnotationService using the new store.
    _annotService.Enable(_annotStore)
End Sub

Основные моменты

Люди используют творческие методы, чтобы привлечь внимание к элементам, интересующим их, когда они помечают документ бумаги, например подчеркивание, выделение, кружение слов в предложении, или рисование меток или нотации в поле. Выделение заметок в Microsoft Annotations Framework предоставляет аналогичную функцию для маркировки информации, отображаемой в элементах управления просмотром документов WPF.

На следующем рисунке показан пример аннотации выделения.

выделение заметки

Обычно пользователи создают аннотации, сначала выделяют текст или интересующий элемент, а затем щелкают правой кнопкой мыши, чтобы отобразить ContextMenu вариантов аннотаций. В следующем примере показан язык разметки расширяемых приложений (XAML), который можно использовать для объявления ContextMenu с маршрутизируемыми командами, к которым пользователи могут получить доступ для создания и управления заметками.

<DocumentViewer.ContextMenu>
  <ContextMenu>
    <MenuItem Command="ApplicationCommands.Copy" />
    <Separator />
    <!-- Add a Highlight annotation to a user selection. -->
    <MenuItem Command="ann:AnnotationService.CreateHighlightCommand"
              Header="Add Highlight" />
    <!-- Add a Text Note annotation to a user selection. -->
    <MenuItem Command="ann:AnnotationService.CreateTextStickyNoteCommand"
              Header="Add Text Note" />
    <!-- Add an Ink Note annotation to a user selection. -->
    <MenuItem Command="ann:AnnotationService.CreateInkStickyNoteCommand"
              Header="Add Ink Note" />
    <Separator />
    <!-- Remove Highlights from a user selection. -->
    <MenuItem Command="ann:AnnotationService.ClearHighlightsCommand"
              Header="Remove Highlights" />
    <!-- Remove Text Notes and Ink Notes from a user selection. -->
    <MenuItem Command="ann:AnnotationService.DeleteStickyNotesCommand"
              Header="Remove Notes" />
    <!-- Remove Highlights, Text Notes, Ink Notes from a selection. -->
    <MenuItem Command="ann:AnnotationService.DeleteAnnotationsCommand"
              Header="Remove Highlights &amp; Notes" />
  </ContextMenu>
</DocumentViewer.ContextMenu>

Привязка данных

Платформа заметок привязывает заметки к данным, которые пользователь выбирает, а не только к позиции в представлении отображения. Таким образом, если представление документа изменяется, например при прокрутке или изменении размера окна отображения, заметка остается с выделением данных, к которому она привязана. Например, на следующем рисунке показана заметка, которую пользователь сделал в выделенном тексте. При изменении представления документа (прокрутки, изменения размера, масштабирования или перемещения) заметка выделения перемещается вместе с исходным выделением данных.

привязка данных аннотации

Сопоставление аннотаций с аннотированным объектом

Заметки можно сопоставить с соответствующими аннотированными объектами. Например, рассмотрим простое приложение чтения документов с областью комментариев. Область комментариев может быть полем списка, отображающим текст из списка заметок, привязанных к документу. Если пользователь выбирает элемент в списке, приложение переносит абзац в документ, к которому привязан соответствующий объект заметки.

В следующем примере показано, как реализовать обработчик событий такого поля списка, который служит в качестве области комментариев.

void annotationsListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{

    Annotation comment = (sender as ListBox).SelectedItem as Annotation;
    if (comment != null)
    {
        // IAnchorInfo info;
        // service is an AnnotationService object
        // comment is an Annotation object
        info = AnnotationHelper.GetAnchorInfo(this.service, comment);
        TextAnchor resolvedAnchor = info.ResolvedAnchor as TextAnchor;
        TextPointer textPointer = (TextPointer)resolvedAnchor.BoundingStart;
        textPointer.Paragraph.BringIntoView();
    }
}
Private Sub annotationsListBox_SelectionChanged(ByVal sender As Object, ByVal e As SelectionChangedEventArgs)

    Dim comment As Annotation = TryCast((TryCast(sender, ListBox)).SelectedItem, Annotation)
    If comment IsNot Nothing Then
        ' service is an AnnotationService object
        ' comment is an Annotation object
        info = AnnotationHelper.GetAnchorInfo(Me.service, comment)
        Dim resolvedAnchor As TextAnchor = TryCast(info.ResolvedAnchor, TextAnchor)
        Dim textPointer As TextPointer = CType(resolvedAnchor.BoundingStart, TextPointer)
        textPointer.Paragraph.BringIntoView()
    End If
End Sub

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

См. также