Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Thomas Lebrun

Tout sur WPF, LINQ, C# et .NET en général !

Actualités

[WPF] Annotez vos applications WPF grâce au Microsoft Annotations Framework

Lorsque l'on prends des notes manuscrites, il arrive fréquemment que l'on écrive, dans les marges ou ailleurs, des petites annotations qui joue un peu le rôle de "penses-bêtes". De même, on a souvent besoin de surligné du texte afin de le mettre en évidence pour montrer son importance.

Afin de réaliser quelque chose de similiaire dans vos applications WPF (Windows Presentation Foundation), Microsoft a développé le MAF: Microsoft Annotations Framework.

  • Qu'est ce que le MAF (Microsoft Annotation Framework) exactement ?

Il s'agit d'un ensemble d'APIs disponibles avec WPF, et qui permettent aux développeurs de proposer, dans leur applications, un système d'annotations et de surlignement des documents.

 

  • Mais quel est l'intérêt ?

Tout simplement de fournir à vos utilisateur une meilleure expérience utilisateur ! Lorsqu'ils travaillent avec des documents, ceux-ci peuvent vouloir mettre en surbrillance certains mots-clés afin de mieux se repérer dans le texte, repérer les notions importantes et ainsi faciliter leur travail. De même pour les annotations, quoi de plus agréable que de prendre des notes directement sur son PC (voire même directement dans l'application en question) plutôt que d'utiliser un bout de feuille que l'on a toute les chances d'égarer Wink

 

  • Comment ca marche ?Très simplement ! Et c'est ce que nous allons voir tout de suite.

    Grâce à WPF, vous allez pouvoir annoter tous les documents qui sont "contenus" dans les contrôles suivants:
    • FlowDocumentPageViewer
    • FlowDocumentScrollViewer
    • FlowDocumentViewer
    • DocumentViewer

<FlowDocumentReader Name="docViewer">
   <FlowDocument TextAlignment="Justify" ContextMenu="{StaticResource MainMenu}">
      <Paragraph>
         C'est dans ce FlowDocument que je vais mettre du texte auquel j'appliquerais des annotations et surligments.
      </Paragraph>
   </FlowDocument>
</FlowDocumentReader>

 

Nous allons maintenant comment utiliser les Commands de la classe AnnotationService pour créer/modifier/editer des notes/surlignements. Tout d'abord, il faut rajouter un namespace, pour faire référence au namespace des Annotations:

xmlns:Anot="clr-namespace:System.Windows.Annotations;assembly=PresentationFramework"

Ensuite, il vous faut créer l'interface utilisateur qui va vous servir à manipuler les notes/surlignements. Vous pouvez créer un Menu, une ToolBar ou bien un ContextMenu, au choix, l'important étant de bien préciser, via le paramètre Command, le nom de la commande à exécuter lors de l'activation de l'item:

<ContextMenu x:Key="MainMenu">
   <MenuItem Header="Annotations">
      <MenuItem Command="Anot:AnnotationService.CreateHighlightCommand" Header="Surligner" />
      <MenuItem Command="Anot:AnnotationService.CreateTextStickyNoteCommand" Header="Nouvelle Note" />
      <MenuItem Command="Anot:AnnotationService.CreateInkStickyNoteCommand" Header="Nouvelle note manuscrite" />
      <MenuItem Command="Anot:AnnotationService.ClearHighlightsCommand" Header="Enlever le surlignement" />
      <MenuItem Command="Anot:AnnotationService.DeleteStickyNotesCommand" Header="Effacer les notes" />
      <MenuItem Command="Anot:AnnotationService.DeleteAnnotationsCommand" Header="Effacer notes et surlignement" />
   </MenuItem>
</ContextMenu>

Examinons d'un peu plus près les différentes commandes disponibles:  

  • CreateHighlightCommand: C'est la commande à utiliser pour surligner du texte 
  • CreateTextStickyNoteCommand: Cette commande vous permettra de créer une nouvelle note
  • CreateInkStickyNoteCommand: Grâce à cette commande, vous allez pouvoir créer une nouvelle note manuscrite (pratique si vous utilisez votre application avec un Tablet PC)
  • ClearHighlightsCommand: A utiliser si vous voulez supprimer le surlignement
  • DeleteStickyNotesCommand: Pour effacer les notes
  • DeleteAnnotationsCommand: Pour effacer notes et surlignements
A présent, il ne reste plus qu'à activer le service des Annotations:

AnnotService = new AnnotationService(docViewer);
AnnotStream = new FileStream("FichierAnnotations.xml", FileMode.OpenOrCreate, FileAccess.ReadWrite);
AnnotStore = new XmlStreamStore(AnnotStream);
AnnotService.Enable(AnnotStore);

Dernière chose à faire pour que tout fonctionne: lors de la fermeture de votre application, il faut penser à vider le buffer pour s'assurer que toutes les données sont bien écrites dans dans le fichier XML:

AnnotStore.Flush();
AnnotStream.Flush();
AnnotStream.Close();

Si vous éxécutez votre application, vous vous rendrez alors compte que vous pouvez sélectionner du texte, et utiliser les notes/annotations via le clic droit:

Notes WPF

Notes WPF (2)

En jaune, nous avons le surlignement (comme un simple marqueur Wink) et en vert, il s'agit des notes que vous avez saisit.

 

  • Puis-je modifier le style des notes ?

Oui, cela est possible. Pour cela, vous devez simplement, dans les ressources de votre contrôle ou fenêtre, déclarer un style qui s'appliquera au contrôle de type "StickyNoteControl". Pour en savoir plus sur le sujet, je vous conseille ce post:
http://blogs.msdn.com/mehlhorn/archive/2006/07/07/659196.aspx

 

  • XML c'est bien mais si je veux être "Full .NET 3" puis-je utiliser du XPS pour stocker mes annotations ?

Tout à fait ! Cependant, il va vous falloit modifier un peu votre code.

En effet, souvenez-vous que les fichiers XPS sont constitués de Package. Par conséquent, vous allez devoir ouvrir le fichier XPS et insérer les annotations/surlignement dans le package adéquat. Si celui-ci n'existe pas dans votre fichier XPS, le programme va alors le créer:

AnnotService = new AnnotationService(this.docViewer);

System.Windows.Xps.Packaging.XpsDocument _xpsDocument = new System.Windows.Xps.Packaging.XpsDocument("Annotations.xps", FileAccess.ReadWrite);
System.IO.Packaging.Package xpsPackage = System.IO.Packaging.PackageStore.GetPackage(_xpsDocument.Uri);
Uri annotPartUri = System.IO.Packaging.PackUriHelper.CreatePartUri(new Uri("AnnotationStream", UriKind.Relative));
System.IO.Packaging.PackagePart annotPart = null;
try
{
   // If annotation stream already exists load that.
   annotPart = xpsPackage.GetPart(annotPartUri);
}
catch (Exception)
{
   // If annotation stream doesn't exist create one.
   annotPart = xpsPackage.CreatePart(annotPartUri, "Annotations/Stream");
}
// Load annotations from the package.
AnnotStore = new XmlStreamStore(annotPart.GetStream());
AnnotService.Enable(AnnotStore);

Et voila, maintenant tout est enregistrer dans votre fichier "Annotation.xps" Smile

A titre d'informations, voici le contenu d'un fichier XML lorsque vous avez ajouteé des annotations/surligments à votre document:

<anb:Text version="1.0" encoding="utf-8" xmlns:anc="http://schemas.microsoft.com/windows/annotations/2003/11/core" xmlns:anb="http://schemas.microsoft.com/windows/annotations/2003/11/base" Id="5bb930af-1bef-4db4-bebf-634e5f8b3d79" CreationTime="2006-11-09T15:30:10.1472522+01:00" LastModificationTime="2006-11-09T15:30:10.1482555+01:00" Type="anb:Highlight" Id="782a4e4b-cb23-45b8-bfaf-6fa9fea10383" Name="Value" Value="FlowDocument" Name="Segment0" Value="2,13" Name="Count" Value="1" Id="95722a48-3de4-4cc9-8681-d91e99d7d4dc" CreationTime="2006-11-09T15:30:27.0749298+01:00" LastModificationTime="2006-11-09T15:34:35.4277986+01:00" Type="anb:TextStickyNote" Id="a5407489-47c8-4ea6-b667-1b4e5af02240" Name="Value" Value="FlowDocument" Name="Segment0" Value="64,79" Name="Count" Value="1" Id="41f230d8-f674-4f61-9c0e-d52dfaca1a0f" Name="Meta Data" anb:ZOrder="0" anb:IsExpanded="False" Id="c072277d-de9a-4f9f-ad20-75da8e704320" Name="Text Data">PFNlY3Rpb24geG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd2luZngvMjAwNi94YW1sL3ByZXNlbnRhdGlvbiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgVGV4dEFsaWdubWVudD0iTGVmdCIgTGluZUhlaWdodD0iQXV0byIgSXNIeXBoZW5hdGlvbkVuYWJsZWQ9IkZhbHNlIiB4bWw6bGFuZz0iZW4tdXMiIEZsb3dEaXJlY3Rpb249IkxlZnRUb1JpZ2h0IiBOdW1iZXJTdWJzdGl0dXRpb24uQ3VsdHVyZVNvdXJjZT0iVGV4dCIgTnVtYmVyU3Vic3RpdHV0aW9uLlN1YnN0aXR1dGlvbj0iQXNDdWx0dXJlIiBGb250RmFtaWx5PSJWZXJkYW5hIiBGb250U3R5bGU9Ik5vcm1hbCIgRm9udFdlaWdodD0iTm9ybWFsIiBGb250U3RyZXRjaD0iTm9ybWFsIiBGb250U2l6ZT0iMTIiIEZvcmVncm91bmQ9IiNGRjAwMDAwMCIgVHlwb2dyYXBoeS5TdGFuZGFyZExpZ2F0dXJlcz0iVHJ1ZSIgVHlwb2dyYXBoeS5Db250ZXh0dWFsTGlnYXR1cmVzPSJUcnVlIiBUeXBvZ3JhcGh5LkRpc2NyZXRpb25hcnlMaWdhdHVyZXM9IkZhbHNlIiBUeXBvZ3JhcGh5Lkhpc3RvcmljYWxMaWdhdHVyZXM9IkZhbHNlIiBUeXBvZ3JhcGh5LkFubm90YXRpb25BbHRlcm5hdGVzPSIwIiBUeXBvZ3JhcGh5LkNvbnRleHR1YWxBbHRlcm5hdGVzPSJUcnVlIiBUeXBvZ3JhcGh5Lkhpc3RvcmljYWxGb3Jtcz0iRmFsc2UiIFR5cG9ncmFwaHkuS2VybmluZz0iVHJ1ZSIgVHlwb2dyYXBoeS5DYXBpdGFsU3BhY2luZz0iRmFsc2UiIFR5cG9ncmFwaHkuQ2FzZVNlbnNpdGl2ZUZvcm1zPSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQxPSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQyPSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQzPSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQ0PSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQ1PSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQ2PSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQ3PSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQ4PSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQ5PSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQxMD0iRmFsc2UiIFR5cG9ncmFwaHkuU3R5bGlzdGljU2V0MTE9IkZhbHNlIiBUeXBvZ3JhcGh5LlN0eWxpc3RpY1NldDEyPSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQxMz0iRmFsc2UiIFR5cG9ncmFwaHkuU3R5bGlzdGljU2V0MTQ9IkZhbHNlIiBUeXBvZ3JhcGh5LlN0eWxpc3RpY1NldDE1PSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQxNj0iRmFsc2UiIFR5cG9ncmFwaHkuU3R5bGlzdGljU2V0MTc9IkZhbHNlIiBUeXBvZ3JhcGh5LlN0eWxpc3RpY1NldDE4PSJGYWxzZSIgVHlwb2dyYXBoeS5TdHlsaXN0aWNTZXQxOT0iRmFsc2UiIFR5cG9ncmFwaHkuU3R5bGlzdGljU2V0MjA9IkZhbHNlIiBUeXBvZ3JhcGh5LkZyYWN0aW9uPSJOb3JtYWwiIFR5cG9ncmFwaHkuU2xhc2hlZFplcm89IkZhbHNlIiBUeXBvZ3JhcGh5Lk1hdGhlbWF0aWNhbEdyZWVrPSJGYWxzZSIgVHlwb2dyYXBoeS5FYXN0QXNpYW5FeHBlcnRGb3Jtcz0iRmFsc2UiIFR5cG9ncmFwaHkuVmFyaWFudHM9Ik5vcm1hbCIgVHlwb2dyYXBoeS5DYXBpdGFscz0iTm9ybWFsIiBUeXBvZ3JhcGh5Lk51bWVyYWxTdHlsZT0iTm9ybWFsIiBUeXBvZ3JhcGh5Lk51bWVyYWxBbGlnbm1lbnQ9Ik5vcm1hbCIgVHlwb2dyYXBoeS5FYXN0QXNpYW5XaWR0aHM9Ik5vcm1hbCIgVHlwb2dyYXBoeS5FYXN0QXNpYW5MYW5ndWFnZT0iTm9ybWFsIiBUeXBvZ3JhcGh5LlN0YW5kYXJkU3dhc2hlcz0iMCIgVHlwb2dyYXBoeS5Db250ZXh0dWFsU3dhc2hlcz0iMCIgVHlwb2dyYXBoeS5TdHlsaXN0aWNBbHRlcm5hdGVzPSIwIj48UGFyYWdyYXBoPjxSdW4geG1sOmxhbmc9ImZyLWZyIj5JY2ksIHRhcGV6IGxhIG5vdGUgcXVlIHZvdXMgdm91bGV6ICE8L1J1bj48L1BhcmFncmFwaD48L1NlY3Rpb24+</anc:Annotations Id="998542f5-2aea-49d6-a786-099e0db635e1" CreationTime="2006-11-09T15:34:39.4209326+01:00" LastModificationTime="2006-11-09T15:34:39.4219359+01:00" Type="anb:Highlight" Id="2c1c8d95-3614-4627-ac62-e8e3117920c7" Name="Value" Value="FlowDocument" Name="Segment0" Value="16,57" Name="Count" Value="1">

 

Remarques:
La V1 de WPF ne supporte pas les annotations sur les TextBox et les RichTextBox. Pour pallier à cela, ce que vous devez faire, c'est insérer votre texte dans un FlowDocument, qui lui-même est dans un FlowDocumentScrollViewer Smile

 

Voila, j'espère que ce petit article sur les Annotations WPF vous a intéressé.

 

A+

 

 

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: jeudi 9 novembre 2006 16:41 par Thomas LEBRUN
Classé sous : ,

Commentaires

cyril a dit :

Interessant tout ca :)

MAF fait partis de .net 3 ? où il faut (déjà) rajouter une surcouche ?

# novembre 10, 2006 00:52

Thomas LEBRUN a dit :

Non, c'est dans .NET 3 donc il te faut juste de quoi développer avec .NET 3 / WPF:

http://msdn2.microsoft.com/en-us/library/ms748864.aspx

A+ :)

# novembre 10, 2006 09:51
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01