Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

UWP / WinRT : utiliser le presse-papiers

Le presse-papiers a été la première évolution “collaborative” des OS. La première tentative d’améliorer la coopération entre applications. Si les 'Charmes' de Windows 8+ sont les lointains descendants de cette volonté de simplifier la recherche, le partage et les échanges de données, le presse-papiers n’est pas devenu obsolète pour autant ! Au contraire, c’est le B.A-BA d’une bonne UX…

Les API du presse-papiers

UWP, comme WinRT et ses milliers d’API ne pouvait pas oublier le presse-papiers… C’est pourquoi on retrouve une classe statique Clipboard dans l’espace de noms Windows.ApplicationModel.DataTransfer.

Cette API a sa propre philosophie et elle utilise notamment un objet messager, le DataPackage, comme vecteur des informations écrites dans le presse-papiers.

Mais regardons d’abord la classe Clipboard :

 public static class Clipboard
{
    public static DataPackageView GetContent();
    public static void SetContent(DataPackage content);
    public static void Flush();
    public static void Clear();
    public static event EventHandler<object> ContentChanged;
}

GetContent() est la méthode qui bien entendu permet de récupérer le contenu actuel du presse-papiers (noté PP plus loin) et SetContent() celle qui permet d’écrire dans ce dernier.

La méthode Clear() vide le PP, ContentChanged est un événement qui est déclenché quand le contenu du PP change et Flush() est un peu plus subtile puisque cette méthode ajoute le DataPackage au PP tout en le libérant de son application source de telle façon à ce que le contenu partagé puisse être disponible même une fois cette dernière éteinte (supprimée de la mémoire).

La lecture et l’écriture dans le PP se font via des DataPackage

Le PP de Windows 10 comme celui de ces prédécesseurs couvre bien plus que de simples données textes comme le faisait celui des premières versions de Windows… On peut donc y trouver des données de type plus vastes et correspondant mieux aux besoins des utilisateurs et des développeurs d’applications modernes.

Les types supportés vont ainsi de l’incontournable morceau de texte brut jusqu’aux fichiers en passant par les images et le texte mis en forme.

UWP s’est rangé du côté des standards, le texte formaté doit être écrit en HTML (et interprété comme tel quand il est lu depuis le PP) bien que RTF soit toujours soutenu.

Les principales utilisations

Les écritures

Placer du texte dans le PP est certainement l’opération la plus simple et la plus banale, et heureusement c’est la plus simple :

    var dataPackage = new DataPackage();
    dataPackage.SetText("blabla");
    Clipboard.SetContent(dataPackage);

 

Le texte ainsi copié dans le PP est disponible au sein de l’application, des autres applications UAP mais aussi des applications standards en bureau classique (WPF par exemple).

Placer du texte formaté est à peine plus compliqué. On passe par une étape supplémentaire qui met en forme le texte HTML via le HtmlFormatHelper :

    var dataPackage = new DataPackage();
    var htmlContent = HtmlFormatHelper.CreateHtmlFormat("<b>blabla</b>");
    dataPackage.SetHtmlFormat(htmlContent);
    Clipboard.SetContent(dataPackage);

 

Placer une image dans le PP est tout aussi direct, du moment qu’on dispose d’une image en mémoire, sinon il faut passer par une URI. 

    var dataPackage = new DataPackage();
    var storageFile = await StorageFile.GetFileFromApplicationUriAsync("Z:\soleil.jpg");
    dataPackage.SetBitmap(RandomAccessStreamReference.CreateFromFile(storageFile));
    Clipboard.SetContent(dataPackage);

 

Si le bitmap est déjà en mémoire on peut donc directement appeler le SetBitmap().

Placer un fichier dans le PP suit un chemin à peine plus compliqué :

    var dataPackage = new DataPackage();
    var files = new List<StorageFile>();
    var storageFile = await StorageFile.GetFileFromApplicationUriAsync("X:\data.sql");
    files.Add(storageFile);
    dataPackage.SetStorageItems(files);
    Clipboard.SetContent(dataPackage);

 

Comme on le remarque ici l’API fonctionne en réalité sur une liste de fichiers. On peut comme dans l’exemple ci-dessus ne passer qu’un seul fichier ou répéter l’opération GetFileFromApplicationUriAsync() pour ajouter les fichiers à la List<StorageFile>.

On voit ici que toutes les API WinRT n'ont pas été réécrites pour UWP et qu'on retrouve le model asynchrone EAP et non TAP (voir les articles sur ce sujet).

Les lectures

La lecture du PP est extrêmement simple puisqu’il suffit d’écrire un code de ce genre :

var dataPackage = Clipboard.GetContent();

 

Il ne reste plus qu’à utiliser l'instance obtenue. Pour cela il est tout de même nécessaire de contrôler ce qu’elle contient…

le DataPackage propose une méthode Contains() qui permet de tester ce contenu en utilisant l’énumération StandardDataFormat qui offrait les valeurs suivantes sous WinRT : Text, Html, Bitmap et StorageItems auxquelles s'ajoutent ApplicationLink, Uri et WebLink.

Pour savoir si le PP contient du texte brut il suffit donc d’écrire :

if (dataPackage.Contains(StandardDataFormats.Text)) ...

 

On opère donc de la même manière pour savoir s’il s’agit d’une image, d’un fichier ou de Html. Charge à l’application de savoir quoi faire des données reçues.

Conclusion

L’API de gestion du presse-papiers n’est pas la plus exaltante de UWP d'autant qu'elle emprunte beaucoup à celle de WinRT, c’est une évidence. Mais elle devrait être couverte par toutes les applications, même les plus simples. Vous savez à quel point je suis attaché au Design et à l’UX des applications. Le presse-papiers permet d’enfoncer le clou car souvent les choses les plus simples sont les plus mal supportées par les applications… Copier/Coller des données, l’utilisateur s’attend au minimum à ce niveau zéro de l’UX qu’est le partage d’information via le PP.

Bien entendu l’OS gère de base le Copier/Coller sur les zones de texte. Mais il ne le fait pas avec les autres types de données.

Et même en texte brut il peut être intelligent de proposer des modes de copie un peu avancés (comme copier le nom et l’adresse d’une fiche client en une seule fois au lieu d’obliger l’utilisateur qui veut récupérer ces données pour faire une lettre dans Word à copier chaque champ l’un après l’autre et jurer tout ce qu’il peut à l’encontre du @&@! de développeur qui n’a pas penser à une chose si simple…). Je ne parle pas non plus de la magie qui fera d’un simple utilisateur un fan inconditionnel et qui consiste à savoir découper les données d’autres applications de façon habile pour remplir automatiquement via un Coller toute une série de champs par exemple. C’est difficile à faire dans l’absolu mais dans le cadre d’un environnement logiciel balisé (comme c’est souvent le cas en entreprise) c’est déjà plus facile. Et là le presse-papiers peut se transformer en une arme de séduction redoutable…

Pensez-y ! .. Et ...

Stay Tuned !

blog comments powered by Disqus