Condividi tramite


Modello a oggetti per l'input della penna: Windows Forms e COM contro WPF

Esistono essenzialmente tre piattaforme che supportano l'inchiostro digitale: la piattaforma Windows Forms Tablet PC, la piattaforma Tablet PC COM 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 del supporto alla 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 Forms 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 inchiostro. 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. Con il InkCanvas, l'utente può copiare, selezionare e ridimensionare l'inchiostro. È possibile aggiungere altri controlli a InkCanvas, e l'utente può anche scrivere a mano su questi controlli. È possibile creare un controllo personalizzato abilitato per l'inchiostro aggiungendo un oggetto InkPresenter e raccogliendo i punti dello stilo.

La tabella seguente elenca dove trovare ulteriori informazioni sull'abilitazione dell'inchiostro in un'applicazione.

Per fare questo… Nella piattaforma WPF... Nelle piattaforme Windows Form/COM...
Aggiungere un controllo abilitato all'inchiostro a un'applicazione Consultare Introduzione all'input penna. Consulta Esempio di Modulo di Richiesta Sinistri Auto
Abilitare la funzione di inchiostro su un controllo personalizzato Vedere Creazione di un controllo di input penna. Vedere Esempio di Appunti con Input Penna.

Dati inchiostro

Nelle piattaforme Windows Forms 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 dell'inchiostro, come test di impatto, cancellazione, trasformazione e serializzazione dell'inchiostro. 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 seguente coppia di illustrazioni confronta i modelli di oggetti dati di inchiostro. Nelle piattaforme Windows Forms e COM, l'oggetto Microsoft.Ink.Ink vincola la durata degli oggetti Microsoft.Ink.Stroke, e i pacchetti della penna appartengono ai singoli tratti. Due o più tratti possono fare riferimento allo stesso oggetto Microsoft.Ink.DrawingAttributes , come illustrato nella figura seguente.

Diagramma del modello a oggetti Ink per COM/Winforms.

In WPF, ogni System.Windows.Ink.Stroke è un oggetto del Common Language Runtime che esiste finché qualcosa ha un riferimento ad esso. Ogni Stroke riferisce a un StylusPointCollection e un System.Windows.Ink.DrawingAttributes, che sono oggetti Common Language Runtime.

Diagramma del modello di oggetti Ink per WPF.

La tabella seguente confronta come eseguire alcune attività comuni sulla piattaforma WPF e sulle piattaforme Windows Form e COM.

Attività Fondazione per la Presentazione di Windows Windows Forms e COM
Risparmia inchiostro Save Microsoft.Ink.Ink.Save
Carica inchiostro Crea un StrokeCollection con il costruttore StrokeCollection. Microsoft.Ink.Ink.Load
Test di collisione HitTest Microsoft.Ink.Ink.HitTest
Copia Inchiostro CopySelection Microsoft.Ink.Ink.ClipboardCopy
Incolla inchiostro Paste Microsoft.Ink.Ink.ClipboardPaste
Accedere alle proprietà personalizzate di una raccolta di tratti AddPropertyData Le proprietà vengono archiviate internamente e accessibili tramite AddPropertyData, RemovePropertyDatae ContainsPropertyData. Usare Microsoft.Ink.Ink.ExtendedProperties

Condivisione dell'inchiostro tra piattaforme

Anche se le piattaforme hanno modelli a oggetti diversi per i dati dell'inchiostro, è molto semplice condividere questi dati tra le piattaforme. Gli esempi seguenti salvano l'inchiostro da un'applicazione Windows Forms e caricano l'inchiostro 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'inchiostro da un'applicazione Windows Presentation Foundation e caricano l'inchiostro in un'applicazione 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

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 ulteriori informazioni sul threading in relazione a questi eventi, vedere Considerazioni generali sul threading e Thread su cui un evento può attivarsi.

Nella piattaforma Windows Presentation Foundation la classe UIElement ha eventi per l'input 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.

Il diagramma seguente mostra un confronto tra 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.

Diagramma degli eventi dello stilo in WPF e Winforms.

Dati penna digitale

Tutte e tre le piattaforme consentono di intercettare e manipolare i dati provenienti da una penna per tablet. Nelle piattaforme Windows Form e COM questo risultato viene ottenuto 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 nella raccolta StylusPlugIns 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 dell'inchiostro tramite eventi dal 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 oggetto per le classi che ricevono i dati della penna nel pool di thread della penna.

Diagramma del modello StylusPlugin WPF e Winforms.