Modello a oggetti Ink: confronto di Windows Form e COM con WPF
Sono essenzialmente tre le piattaforme che supportano l'input penna, la piattaforma Windows Form di Tablet PC, la piattaforma COM di Tablet PC e la piattaforma Windows Presentation Foundation (WPF). Le piattaforme Windows Form e COM condividono un modello a oggetti simile, mentre il modello a oggetti per la piattaforma WPF è sostanzialmente diverso. In questo argomento vengono illustrate le differenze ad alto livello in modo che gli sviluppatori che hanno utilizzato un modello a oggetti possano comprendere anche l'altro.
Abilitazione dell'input penna in un'applicazione
Tutte e tre le piattaforme forniscono oggetti e controlli che consentono a un'applicazione di ricevere l'input da una penna del Tablet PC. Nelle piattaforme Windows Form e COM sono disponibili le classi InkPicture, InkEdit, InkOverlay e InkCollector. I controlli InkPicture e InkEdit possono essere aggiunti a un'applicazione per raccogliere l'input penna. I controlli InkOverlay e InkCollector possono essere collegati a una finestra esistente per abilitare all'input penna le finestre e i controlli personalizzati.
La piattaforma WPF include il controllo InkCanvas. È possibile aggiungere un controllo InkCanvas all'applicazione e avviare immediatamente la raccolta dell'input penna. Il controllo InkCanvas consente di copiare, selezionare e ridimensionare l'input penna. È possibile aggiungere altri controlli a InkCanvas e inserire grafia su di essi. È possibile creare un controllo personalizzato che supporti l'input penna aggiungendo a esso un oggetto InkPresenter e raccogliendo i relativi punti dello stilo.
Nella tabella seguente viene indicato dove ottenere ulteriori informazioni sul supporto dell'input penna in un'applicazione:
Per: |
Nella piattaforma WPF: |
Nelle piattaforme Windows Form/COM: |
---|---|---|
Aggiungere un controllo abilitato per l'input penna a un'applicazione |
Vedere Nozioni di base sull'input penna. |
Vedere Auto Claims Form Sample |
Abilitare l'input penna su un controllo personalizzato |
Vedere Ink Clipboard Sample. |
Dati dell'input penna
Nelle piattaforme Windows Form e COM InkCollector, InkOverlay, InkEdit e InkPicture espongono ognuno un oggetto Ink. L'oggetto Ink contiene i dati per uno o più oggetti Stroke ed espone proprietà e metodi comuni per gestire e modificare questi tratti. L'oggetto Ink consente di gestire la durata dei tratti in esso contenuti, mentre l'oggetto Ink consente di creare ed eliminare i tratti di sua proprietà. Ogni oggetto Stroke dispone di un identificatore univoco all'interno del relativo oggetto Ink padre.
Nella piattaforma WPF la classe System.Windows.Ink.Stroke è proprietaria della propria durata e la gestisce. Un gruppo di oggetti Stroke può essere raccolto in un oggetto StrokeCollection che fornisce metodi per operazioni di gestione comuni dei dati dell'input penna quali hit testing, cancellazione, trasformazione e serializzazione dell'input penna. Un oggetto Stroke può appartenere, in un determinato momento, a zero, uno o più oggetti StrokeCollection. Anziché contenere un oggetto Ink, gli oggetti InkCanvas e InkPresenter contengono un oggetto System.Windows.Ink.StrokeCollection.
Nelle due illustrazioni seguenti vengono confrontati i modelli a oggetti dei dati dell'input penna. Nelle piattaforme Windows Form e COM, l'oggetto Ink limita la durata degli oggetti Stroke e i pacchetti di stilo appartengono ai singoli tratti. Due o più tratti possono fare riferimento allo stesso oggetto DrawingAttributes, come illustrato di seguito.
Nella piattaforma WPF, ogni System.Windows.Ink.Stroke è un oggetto Common Language Runtime che esiste fino a quando un qualsiasi elemento contiene un riferimento a esso. Ogni Stroke fa riferimento agli oggetti StylusPointCollection e System.Windows.Ink.DrawingAttributes, anch'essi oggetti Common Language Runtime.
Nella tabella seguente viene illustrato come eseguire alcune attività comuni nella piattaforma WPF e nelle piattaforme Windows Form e COM.
Attività |
Windows Presentation Foundation |
Windows Forms e COM |
---|---|---|
Salvare l'input penna |
Save() |
|
Caricare l'input penna |
Creare un oggetto StrokeCollection con il costruttore StrokeCollection.StrokeCollection(Stream). |
Load(Byte[]) |
Eseguire hit test |
HitTest() |
|
Copiare l'input penna |
ClipboardCopy() |
|
Incollare l'input penna |
ClipboardPaste() |
|
Accedere a proprietà personalizzate in un insieme di tratti |
AddPropertyData (le proprietà sono archiviate internamente e accessibili tramite AddPropertyData, RemovePropertyData e ContainsPropertyData) |
Utilizzare ExtendedProperties() |
Condivisione di input penna tra piattaforme
Sebbene le piattaforme offrano modelli a oggetti diversi per i dati dell'input penna, la condivisione tra piattaforme non presenta particolari problemi. Nell'esempio riportato di seguito l'input penna viene salvato in un'applicazione Windows Form e caricato in un'applicazione Windows Presentation Foundation.
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>
Function SaveInkInWinforms(ByVal inkToSave As Ink) As MemoryStream
Dim savedInk As Byte() = inkToSave.Save()
Return New MemoryStream(savedInk)
End Function 'SaveInkInWinforms
using Microsoft.Ink;
using 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));
}
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 Sub LoadInkInWPF(ByVal inkStream As MemoryStream)
strokes = New StrokeCollection(inkStream)
End Sub 'LoadInkInWPF
using 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);
}
Nell'esempio riportato di seguito l'input penna viene salvato in un'applicazione Windows Presentation Foundation e caricato in un'applicazione Windows Form.
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>
Function SaveInkInWPF(ByVal strokesToSave As StrokeCollection) As MemoryStream
Dim savedInk As New MemoryStream()
strokesToSave.Save(savedInk)
Return savedInk
End Function 'SaveInkInWPF
using 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;
}
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 Sub LoadInkInWinforms(ByVal savedInk As MemoryStream)
theInk = New Ink()
theInk.Load(savedInk.ToArray())
End Sub 'LoadInkInWinforms
using Microsoft.Ink;
using 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());
}
Eventi dalla penna del Tablet PC
All'immissione di dati con la penna per Tablet PC, gli oggetti InkOverlay, InkCollector e InkPicture nelle piattaforme Windows Form e COM ricevono eventi. L'oggetto InkOverlay o InkCollector è collegato a una finestra o a un controllo e può sottoscrivere gli eventi generati dai dati immessi con la penna per Tablet PC. Il thread su cui si verificano questi eventi varia a seconda che gli eventi vengano generati con una penna, un mouse o a livello di codice. Per ulteriori informazioni sul threading in relazione a questi eventi, vedere General Threading Considerations e Threads on Which an Event Can Fire.
Nella piattaforma Windows Presentation Foundation, la classe UIElement dispone di eventi per l'input penna. Ogni controllo espone pertanto l'insieme completo di eventi dello stilo. Gli eventi dello stilo dispongono di coppie di eventi di tunneling/bubbling e si verificano sempre sul thread dell'applicazione. Per ulteriori informazioni, vedere Cenni preliminari sugli eventi indirizzati.
Nel diagramma riportato di seguito vengono confrontati i modelli a oggetti per le classi che generano gli eventi dello stilo. Il modello a oggetti di Windows Presentation Foundation mostra solo gli eventi di bubbling, non quelli di tunneling.
Dati della penna
Tutte e tre le piattaforme consentono di intercettare e modificare i dati immessi tramite una penna per Tablet PC. Nelle piattaforme Windows Form e COM queste operazioni possono essere eseguite creando un oggetto RealTimeStylus a cui viene collegata una finestra o un controllo, quindi creando una classe che implementa l'interfaccia IStylusSyncPlugin o IStylusAsyncPlugin. Il plug-in personalizzato viene quindi aggiunto all'insieme di plug-in dell'oggetto RealTimeStylus. Per ulteriori informazioni su questo modello a oggetti, vedere Architecture of the StylusInput APIs.
Nella piattaforma WPF la classe UIElement espone un insieme di plug-in, con progettazione simile a RealTimeStylus. Per intercettare i dati della penna, creare una classe che erediti da StylusPlugIn e aggiungere l'oggetto all'insieme StylusPlugIns dell'oggetto UIElement. Per ulteriori informazioni su questa interazione, vedere Intercettazione dell'input dello stilo.
In tutte le piattaforme, un pool di thread riceve i dati dell'input pen tramite eventi dello stile e li invia al thread dell'applicazione. Per ulteriori informazioni sul threading nelle piattaforme COM e Windows, vedere Threading Considerations for the StylusInput APIs. Per ulteriori informazioni sul threading nella piattaforma Windows Presentation Software, vedere Modello di threading dell'input penna.
Nell'illustrazione seguente vengono confrontati i modelli a oggetti per le classi che ricevono i dati della penna sul pool di thread della penna.