Modello a oggetti Ink: confronto di Windows Form e COM con WPF
Esistono essenzialmente tre piattaforme che supportano l'input penna digitale: la piattaforma Tablet PC Windows Form, la piattaforma COM tablet PC e la piattaforma Windows Presentation Foundation (WPF). Le piattaforme Windows Form e COM condividono un modello a oggetti simile, ma il modello a oggetti per la piattaforma WPF è sostanzialmente diverso. In questo argomento vengono illustrate le differenze a livello generale, in modo che gli sviluppatori che hanno lavorato con un modello a oggetti possano comprendere meglio l'altro.
Abilitazione dell'input penna in un'applicazione
Tutte e tre le piattaforme spediscono oggetti e controlli che consentono a un'applicazione di ricevere input da una penna per tablet. Le piattaforme Windows Form e COM vengono fornite con le classi Microsoft.Ink.InkPicture, Microsoft.Ink.InkEdit, Microsoft.Ink.InkOverlay e Microsoft.Ink.InkCollector. Microsoft.Ink.InkPicture e Microsoft.Ink.InkEdit sono controlli che è possibile aggiungere a un'applicazione per raccogliere input penna. Microsoft.Ink.InkOverlay e Microsoft.Ink.InkCollector possono essere collegati a una finestra esistente per abilitare finestre e controlli personalizzati.
La piattaforma WPF include il InkCanvas controllo . È possibile aggiungere un oggetto InkCanvas all'applicazione e iniziare subito a raccogliere input penna. InkCanvasCon , l'utente può copiare, selezionare e ridimensionare l'input penna. È possibile aggiungere altri controlli a InkCanvase l'utente può anche modificare tali controlli. È possibile creare un controllo personalizzato abilitato per l'input penna aggiungendo un oggetto InkPresenter e raccogliendone i punti dello stilo.
La tabella seguente elenca dove ottenere altre informazioni sull'abilitazione dell'input penna in un'applicazione:
Operazione da eseguire | Nella piattaforma WPF... | Nelle piattaforme Windows Form/COM... |
---|---|---|
Aggiungere un controllo abilitato per l'input penna a un'applicazione | Vedere Introduzione all'input penna. | Vedere Esempio di modulo attestazioni automatica |
Abilitare l'input penna in un controllo personalizzato | Vedere Creazione di un controllo input input penna. | Vedere Esempio degli Appunti input penna. |
Dati input penna
Nelle piattaforme Windows Form e COM, Microsoft.Ink.InkCollector, Microsoft.Ink.InkOverlay, Microsoft.Ink.InkEdit e Microsoft.Ink.InkPicture espongono ognuno un oggetto Microsoft.Ink.Ink.Ink. L'oggetto Microsoft.Ink.Ink contiene i dati per uno o più oggetti Microsoft.Ink.Stroke ed espone metodi e proprietà comuni per gestire e modificare tali tratti. L'oggetto Microsoft.Ink.Ink gestisce la durata dei tratti contenuti. L'oggetto Microsoft.Ink.Ink crea ed elimina i tratti di cui è proprietario. Ogni Microsoft.Ink.Stroke ha un identificatore univoco all'interno dell'oggetto Microsoft.Ink.Ink padre.
Nella piattaforma WPF la System.Windows.Ink.Stroke classe è proprietaria e gestisce la propria durata. Un gruppo di Stroke oggetti può essere raccolto insieme in un StrokeCollection, che fornisce metodi per operazioni comuni di gestione dei dati input penna, ad esempio hit testing, cancellazione, trasformazione e serializzazione dell'input penna. Un Stroke oggetto può appartenere a zero, uno o più StrokeCollection oggetti in qualsiasi momento. Anziché avere un oggetto Microsoft.Ink.Ink , InkCanvas e InkPresenter contenere un oggetto System.Windows.Ink.StrokeCollection.
La coppia di illustrazioni seguente confronta i modelli a oggetti dati input penna. Nelle piattaforme Windows Form e COM, l'oggetto Microsoft.Ink.Ink vincola la durata degli oggetti Microsoft.Ink.Stroke e i pacchetti dello stilo appartengono ai singoli tratti. Due o più tratti possono fare riferimento allo stesso oggetto Microsoft.Ink.DrawingAttributes , come illustrato nella figura seguente.
In WPF ogni System.Windows.Ink.Stroke oggetto è un oggetto Common Language Runtime esistente, purché vi sia un riferimento a un elemento. Ogni Stroke oggetto fa riferimento a un StylusPointCollection oggetto e System.Windows.Ink.DrawingAttributes , che sono anche oggetti Common Language Runtime.
La tabella seguente confronta come eseguire alcune attività comuni sulla piattaforma WPF e sulle piattaforme WINDOWS FORM e COM.
Attività | Windows Presentation Foundation | Windows Form e COM |
---|---|---|
Salva input penna | Save | Microsoft.Ink.Ink.Save |
Carica input penna | Creare un StrokeCollection oggetto con il StrokeCollection costruttore . | Microsoft.Ink.Ink.Load |
Hit test | HitTest | Microsoft.Ink.Ink.HitTest |
Copia input penna | CopySelection | Microsoft.Ink.Ink.ClipboardCopy |
Incolla input penna | Paste | Microsoft.Ink.Ink.ClipboardPaste |
Accedere alle proprietà personalizzate in una raccolta di tratti | AddPropertyData Le proprietà vengono archiviate internamente e accessibili tramite AddPropertyData, RemovePropertyDatae ContainsPropertyData. | Usare Microsoft.Ink.Ink.ExtendedProperties |
Condivisione dell'input penna tra piattaforme
Anche se le piattaforme hanno modelli a oggetti diversi per i dati input penna, la condivisione dei dati tra le piattaforme è molto semplice. Gli esempi seguenti salvano l'input penna da un'applicazione Windows Form e caricano l'input penna in un'applicazione 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
Gli esempi seguenti salvano l'input penna da un'applicazione Windows Presentation Foundation e caricano l'input penna in un'applicazione Windows Form.
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
Eventi dalla penna tablet
Microsoft.Ink.InkOverlay, Microsoft.Ink.InkCollector e Microsoft.Ink.InkPicture nelle piattaforme Windows Form e COM ricevono eventi quando l'utente inserisce i dati della penna. Microsoft.Ink.InkOverlay o Microsoft.Ink.InkCollector è collegato a una finestra o a un controllo e può sottoscrivere gli eventi generati dai dati di input del tablet. Il thread su cui si verificano questi eventi dipende dal fatto che gli eventi vengano generati con una penna, un mouse o a livello di codice. Per altre informazioni sul threading in relazione a questi eventi, vedere Considerazioni generali sul threading e thread su cui può essere generato un evento.
Nella piattaforma Windows Presentation Foundation la classe include eventi per l'input UIElement penna. Ciò significa che ogni controllo espone il set completo di eventi dello stilo. Gli eventi dello stilo hanno coppie di eventi di tunneling/bubbling e si verificano sempre nel thread dell'applicazione. Per altre informazioni, vedere Cenni preliminari sugli eventi indirizzati.
Nel diagramma seguente vengono confrontati i modelli a oggetti per le classi che generano eventi dello stilo. Il modello a oggetti di Windows Presentation Foundation mostra solo gli eventi di bubbling, non le controparti dell'evento di tunneling.
Dati penna
Tutte e tre le piattaforme consentono di intercettare e manipolare i dati provenienti da una penna per tablet. Nelle piattaforme WINDOWS FORM e COM, questa operazione viene ottenuta creando un Microsoft.StylusInput.RealTimeStylus, collegando una finestra o un controllo e creando una classe che implementa l'interfaccia Microsoft.StylusInput.IStylusSyncPlugin o Microsoft.StylusInput.IStylusAsyncPlugin. Il plug-in personalizzato viene quindi aggiunto alla raccolta plug-in di Microsoft.StylusInput.RealTimeStylus. Per altre informazioni su questo modello a oggetti, vedere Architettura delle API StylusInput.
Nella piattaforma WPF la UIElement classe espone una raccolta di plug-in, simile alla progettazione di Microsoft.StylusInput.RealTimeStylus. Per intercettare i dati della penna, creare una classe che eredita da StylusPlugIn e aggiungere l'oggetto alla StylusPlugIns raccolta di UIElement. Per altre informazioni su questa interazione, vedere Intercettazione dell'input dallo stilo.
In tutte le piattaforme, un pool di thread riceve i dati input penna tramite eventi dello stilo e li invia al thread dell'applicazione. Per altre informazioni sul threading sulle piattaforme COM e Windows, vedere Considerazioni sul threading per le API StylusInput. Per altre informazioni sul threading nel software di presentazione Windows, vedere The Ink Threading Model.For more information about threading on the Windows Presentation Software, see The Ink Threading Model.
Nella figura seguente vengono confrontati i modelli a oggetti per le classi che ricevono i dati della penna nel pool di thread penna.
.NET Desktop feedback