Modèle objet encre : Windows Forms et COM ou WPF
Il existe essentiellement trois plateformes qui prennent en charge l’encre numérique : la plateforme Tablette PC Windows Forms, la plateforme TABLET PC COM et la plateforme WINDOWS Presentation Foundation (WPF). Les plateformes Windows Forms et COM partagent un modèle objet similaire, mais le modèle objet de la plateforme WPF est sensiblement différent. Cette rubrique décrit les différences à un niveau élevé afin que les développeurs qui ont travaillé avec un modèle objet puissent mieux comprendre l’autre.
Activation de l’entrée manuscrite dans une application
Les trois plateformes expédient des objets et des contrôles qui permettent à une application de recevoir une entrée à partir d’un stylet de tablette. Les plateformes Windows Forms et COM sont fournies avec les classes Microsoft.Ink.InkPicture, Microsoft.Ink.InkEdit, Microsoft.Ink.InkOverlay et Microsoft.Ink.InkCollector . Microsoft.Ink.InkPicture et Microsoft.Ink.InkEdit sont des contrôles que vous pouvez ajouter à une application pour collecter des entrées manuscrites. Microsoft.Ink.InkOverlay et Microsoft.Ink.InkCollector peuvent être attachés à une fenêtre existante pour activer des fenêtres manuscrites et des contrôles personnalisés.
La plateforme WPF inclut le InkCanvas contrôle. Vous pouvez ajouter un InkCanvas élément à votre application et commencer à collecter immédiatement des entrées manuscrites. Avec le InkCanvas, l’utilisateur peut copier, sélectionner et redimensionner l’encre. Vous pouvez également ajouter d’autres contrôles à l’utilisateur InkCanvas, et l’utilisateur peut également remplacer ces contrôles. Vous pouvez créer un contrôle personnalisé compatible avec l’entrée manuscrite en l’ajoutant InkPresenter et en collectant ses points de stylet.
Le tableau suivant répertorie où en savoir plus sur l’activation de l’entrée manuscrite dans une application :
Pour faire ceci... | Sur la plateforme WPF... | Sur les plateformes Windows Forms/COM... |
---|---|---|
Ajouter un contrôle avec entrée manuscrite à une application | Consultez Prise en main de l’entrée manuscrite. | Voir l’exemple de formulaire de revendications automatiques |
Activer l’entrée manuscrite sur un contrôle personnalisé | Voir Création d’un contrôle d’entrée manuscrite. | Consultez l’exemple de Presse-papiers manuscrit. |
Données manuscrites
Sur les plateformes Windows Forms et COM, Microsoft.Ink.InkCollector, Microsoft.Ink.InkOverlay, Microsoft.Ink.InkEdit et Microsoft.Ink.InkPicture exposent chacun un objet Microsoft.Ink.Ink.Ink . L’objet Microsoft.Ink.Ink contient les données d’un ou plusieurs objets Microsoft.Ink.Stroke et expose les méthodes et propriétés courantes pour gérer et manipuler ces traits. L’objet Microsoft.Ink.Ink gère la durée de vie des traits qu’il contient ; l’objet Microsoft.Ink.Ink crée et supprime les traits qu’il possède. Chaque Microsoft.Ink.Stroke a un identificateur unique au sein de son objet Parent Microsoft.Ink.Ink .
Sur la plateforme WPF, la System.Windows.Ink.Stroke classe possède et gère sa propre durée de vie. Un groupe d’objets Stroke peut être collecté ensemble dans un StrokeCollection, qui fournit des méthodes pour les opérations courantes de gestion des données manuscrites, telles que les tests d’accès, l’effacement, la transformation et la sérialisation de l’encre. Un Stroke peut appartenir à zéro, un ou plusieurs StrokeCollection objets à tout moment. Au lieu d’avoir un objet Microsoft.Ink.Ink , le InkCanvas et InkPresenter contenir un System.Windows.Ink.StrokeCollection.
La paire d’illustrations suivante compare les modèles objet de données manuscrites. Sur les plateformes Windows Forms et COM, l’objet Microsoft.Ink.Ink limite la durée de vie des objets Microsoft.Ink.Stroke et les paquets de stylet appartiennent aux traits individuels. Deux traits ou plus peuvent référencer le même objet Microsoft.Ink.DrawingAttributes , comme illustré dans l’illustration suivante.
Sur WPF, chacun System.Windows.Ink.Stroke est un objet Common Language Runtime qui existe tant que quelque chose a une référence à celui-ci. Chaque Stroke référence un objet et System.Windows.Ink.DrawingAttributes un StylusPointCollection objet, qui sont également des objets Common Language Runtime.
Le tableau suivant compare comment effectuer certaines tâches courantes sur la plateforme WPF et les plateformes Windows Forms et COM.
Tâche | Windows Presentation Foundation | Windows Forms et COM |
---|---|---|
Enregistrer l’entrée manuscrite | Save | Microsoft.Ink.Ink.Save |
Charger l’entrée manuscrite | Créez un StrokeCollection composant avec le StrokeCollection constructeur. | Microsoft.Ink.Ink.Load |
Test de positionnement | HitTest | Microsoft.Ink.Ink.HitTest |
Copier l’entrée manuscrite | CopySelection | Microsoft.Ink.Ink.Presse-papiersCopy |
Coller l’encre | Paste | Microsoft.Ink.Ink.Presse-papiersPaste |
Accéder aux propriétés personnalisées sur une collection de traits | AddPropertyData (les propriétés sont stockées en interne et accessibles via AddPropertyData, RemovePropertyDataet ContainsPropertyData) | Utiliser Microsoft.Ink.Ink.ExtendedProperties |
Partage d’entrées manuscrites entre plateformes
Bien que les plateformes aient différents modèles objet pour les données manuscrites, le partage des données entre les plateformes est très facile. Les exemples suivants enregistrent des entrées manuscrites à partir d’une application Windows Forms et chargent l’entrée manuscrite dans une application Windows Presentation Foundation.
using Microsoft.Ink;
using System.Drawing;
Imports Microsoft.Ink
Imports System.Drawing
/// <summary>
/// Saves the digital ink from a Windows Forms application.
/// </summary>
/// <param name="inkToSave">An Ink object that contains the
/// digital ink.</param>
/// <returns>A MemoryStream containing the digital ink.</returns>
MemoryStream SaveInkInWinforms(Ink inkToSave)
{
byte[] savedInk = inkToSave.Save();
return (new MemoryStream(savedInk));
}
'/ <summary>
'/ Saves the digital ink from a Windows Forms application.
'/ </summary>
'/ <param name="inkToSave">An Ink object that contains the
'/ digital ink.</param>
'/ <returns>A MemoryStream containing the digital ink.</returns>
Function SaveInkInWinforms(ByVal inkToSave As Ink) As MemoryStream
Dim savedInk As Byte() = inkToSave.Save()
Return New MemoryStream(savedInk)
End Function 'SaveInkInWinforms
using System.Windows.Ink;
Imports System.Windows.Ink
/// <summary>
/// Loads digital ink into a StrokeCollection, which can be
/// used by a WPF application.
/// </summary>
/// <param name="savedInk">A MemoryStream containing the digital ink.</param>
public void LoadInkInWPF(MemoryStream inkStream)
{
strokes = new StrokeCollection(inkStream);
}
'/ <summary>
'/ Loads digital ink into a StrokeCollection, which can be
'/ used by a WPF application.
'/ </summary>
'/ <param name="savedInk">A MemoryStream containing the digital ink.</param>
Public Sub LoadInkInWPF(ByVal inkStream As MemoryStream)
strokes = New StrokeCollection(inkStream)
End Sub
Les exemples suivants enregistrent les entrées manuscrites à partir d’une application Windows Presentation Foundation et chargent l’entrée manuscrite dans une application Windows Forms.
using System.Windows.Ink;
Imports System.Windows.Ink
/// <summary>
/// Saves the digital ink from a WPF application.
/// </summary>
/// <param name="inkToSave">A StrokeCollection that contains the
/// digital ink.</param>
/// <returns>A MemoryStream containing the digital ink.</returns>
MemoryStream SaveInkInWPF(StrokeCollection strokesToSave)
{
MemoryStream savedInk = new MemoryStream();
strokesToSave.Save(savedInk);
return savedInk;
}
'/ <summary>
'/ Saves the digital ink from a WPF application.
'/ </summary>
'/ <param name="inkToSave">A StrokeCollection that contains the
'/ digital ink.</param>
'/ <returns>A MemoryStream containing the digital ink.</returns>
Function SaveInkInWPF(ByVal strokesToSave As StrokeCollection) As MemoryStream
Dim savedInk As New MemoryStream()
strokesToSave.Save(savedInk)
Return savedInk
End Function 'SaveInkInWPF
using Microsoft.Ink;
using System.Drawing;
Imports Microsoft.Ink
Imports System.Drawing
/// <summary>
/// Loads digital ink into a Windows Forms application.
/// </summary>
/// <param name="savedInk">A MemoryStream containing the digital ink.</param>
public void LoadInkInWinforms(MemoryStream savedInk)
{
theInk = new Ink();
theInk.Load(savedInk.ToArray());
}
'/ <summary>
'/ Loads digital ink into a Windows Forms application.
'/ </summary>
'/ <param name="savedInk">A MemoryStream containing the digital ink.</param>
Public Sub LoadInkInWinforms(ByVal savedInk As MemoryStream)
theInk = New Ink()
theInk.Load(savedInk.ToArray())
End Sub
Événements à partir du stylet Tablette
Microsoft.Ink.InkOverlay, Microsoft.Ink.InkCollector et Microsoft.Ink.InkPicture sur les plateformes Windows Forms et COM reçoivent des événements lorsque l’utilisateur entre des données de stylet. Microsoft.Ink.InkOverlay ou Microsoft.Ink.InkCollector est attaché à une fenêtre ou à un contrôle et peut s’abonner aux événements déclenchés par les données d’entrée de tablette. Le thread sur lequel ces événements se produisent varie selon que les événements sont déclenchés avec un stylet, une souris ou par programmation. Pour plus d’informations sur le threading par rapport à ces événements, consultez Considérations générales relatives aux threads et threads sur lesquels un événement peut se déclencher.
Sur la plateforme Windows Presentation Foundation, la UIElement classe a des événements pour l’entrée de stylet. Cela signifie que chaque contrôle expose l’ensemble complet d’événements de stylet. Les événements de stylet ont des paires d’événements tunneling/bubbling et se produisent toujours sur le thread d’application. Pour plus d’informations, consultez Vue d’ensemble des événements acheminés.
Le diagramme suivant montre comment comparer les modèles objet pour les classes qui déclenchent des événements de stylet. Le modèle objet Windows Presentation Foundation affiche uniquement les événements de bubbling, et non les équivalents d’événements de tunneling.
Données de stylet
Les trois plateformes vous offrent des moyens d’intercepter et de manipuler les données provenant d’un stylet tablette. Sur les plateformes Windows Forms et COM, cela est réalisé en créant un Microsoft.StylusInput.RealTimeStylus, en lui attachant une fenêtre ou un contrôle, et en créant une classe qui implémente l’interface Microsoft.StylusInput.IStylusSyncPlugin ou Microsoft.StylusInput.IStylusAsyncPlugin . Le plug-in personnalisé est ensuite ajouté à la collection de plug-ins de Microsoft.StylusInput.RealTimeStylus. Pour plus d’informations sur ce modèle objet, consultez Architecture des API StylusInput.
Sur la plateforme WPF, la UIElement classe expose une collection de plug-ins, similaire à la conception de Microsoft.StylusInput.RealTimeStylus. Pour intercepter des données de stylet, créez une classe qui hérite et StylusPlugIn ajoutez l’objet à la StylusPlugIns collection du UIElement. Pour plus d’informations sur cette interaction, consultez Intercepting Input from the Stylus.
Sur toutes les plateformes, un pool de threads reçoit les données manuscrites via des événements de stylet et les envoie au thread d’application. Pour plus d’informations sur le thread sur les plateformes COM et Windows, consultez Considérations relatives au thread pour les API StylusInput. Pour plus d’informations sur le threading sur le logiciel de présentation Windows, consultez le modèle de thread d’encre.
L’illustration suivante compare les modèles objet pour les classes qui reçoivent des données de stylet sur le pool de threads de stylet.
.NET Desktop feedback