Información general sobre anotaciones

Escribir notas o comentarios en documentos impresos es una actividad tan habitual que la damos casi por sentada. Estas notas o comentarios son "anotaciones" que se agregan a los documentos para marcar la información o resaltar elementos de interés, a fin de consultarlos más adelante. Aunque escribir notas en documentos impresos resulta fácil y es frecuente, la capacidad de agregar comentarios personales a los documentos electrónicos suele estar muy limitada, si es que está disponible en absoluto.

En este tema se revisan varios tipos comunes de anotaciones, en particular las notas rápidas y el resaltado, y se muestra cómo Microsoft Annotations Framework facilita estos tipos de anotaciones en las aplicaciones gracias a los controles de vista de documentos de Windows Presentation Foundation (WPF). Los controles de vista de documentos de WPF que admiten anotaciones incluyen FlowDocumentReader y FlowDocumentScrollViewer, así como los controles derivados de DocumentViewerBase como DocumentViewerFlowDocumentPageViewer.

Este tema contiene las secciones siguientes.

  • Notas rápidas
  • Resaltados
  • Delimitación de datos
  • Hacer coincidir las anotaciones con los objetos anotados
  • Temas relacionados

Notas rápidas

Una nota rápida típica contiene información escrita en un papelito coloreado que se "adhiere" a un documento. Las notas rápidas digitales proporcionan una funcionalidad similar para los documentos electrónicos, pero con la flexibilidad agregada de incluir muchos otros tipos de contenido, como texto mecanografiado, notas manuscritas (por ejemplo, trazos "de lápiz" de Tablet PC) o vínculos web.

La ilustración siguiente muestra algunos ejemplos de anotaciones de resaltado, nota rápida de texto y nota rápida de entrada de lápiz.

Anotaciones de resaltar, texto y nota adhesiva manuscrita.

En el ejemplo siguiente se muestra el método que puede utilizar para habilitar la compatibilidad con las anotaciones en la aplicación.

        ' ------------------------ 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 ' end:StartAnnotations()
// ------------------------ 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()

Resaltados

Las personas utilizan métodos creativos para llamar la atención sobre los elementos de interés cuando marcan a un documento impreso, como subrayar, resaltar, rodear palabras de una frase o dibujar marcas o símbolos en el margen. Las anotaciones de resaltado de Microsoft Annotations Framework proporcionan características parecidas para marcar la a información mostrada en los controles de vista de documentos de WPF.

En la ilustración siguiente se muestra un ejemplo de una anotación de resaltado.

Anotación de resaltar

Para crear una anotación, el usuario suele seleccionar primero algún texto o elemento de interés y, a continuación, hacer clic con el botón secundario del mouse para mostrar un ContextMenu de opciones de anotación. En el ejemplo siguiente se muestra Extensible Application Markup Language (XAML) que puede utilizar para declarar ContextMenu con comandos enrutados a los que el usuario puede tener acceso para crear y administrar anotaciones.

<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>

Delimitación de datos

Annotations Framework enlaza las anotaciones a los datos que el usuario selecciona, no sólo a una posición en la vista de presentación. Por consiguiente, si la vista del documento cambia, como cuando el usuario se desplaza o cambia el tamaño de la ventana de presentación, la anotación permanece con la selección de datos a la que está enlazada. Por ejemplo, en el gráfico siguiente se muestra una anotación que el usuario ha realizado en una selección de texto. Cuando la vista del documento cambia (se desplaza, cambia de tamaño, cambia de escala o se mueve de cualquier otro modo), la anotación de resaltado se mueve a la par que la selección de datos original.

Delimitación de datos de anotación

Hacer coincidir las anotaciones con los objetos anotados

Puede hacer coincidir las anotaciones con los objetos anotados correspondientes. Por ejemplo, supongamos que tiene una aplicación de lector de documentos simple con un panel de comentarios. El panel de comentarios podría ser un cuadro de lista que muestre el texto de una lista de anotaciones delimitadas en un documento. Si el usuario selecciona un elemento en el cuadro de lista, la aplicación muestra el párrafo del documento en el que está delimitado el objeto de anotación correspondiente.

En el ejemplo siguiente se muestra cómo implementar un controlador de eventos de este tipo de cuadro de lista que actúa como un panel de comentarios.

        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
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();
    }
}

Otro ejemplo de escenario es el de las aplicaciones que habilitan el intercambio de anotaciones y notas rápidas entre los lectores del documento a través del correo electrónico. Esta característica permite que estas aplicaciones naveguen por el lector hasta la página que contiene la anotación intercambiada.

Vea también

Tareas

Cómo: Agregar un comando a un elemento de menú

Referencia

DocumentViewerBase

DocumentViewer

FlowDocumentPageViewer

FlowDocumentScrollViewer

FlowDocumentReader

IAnchorInfo

Conceptos

Esquema en anotaciones

Información general sobre ContextMenu

Información general sobre comandos

Información general sobre documentos dinámicos