Pennanteckningsobjektmodellen: Windows Forms och COM jämfört med WPF

Det finns i huvudsak tre plattformar som stöder digital pennanteckning: Plattformen Windows Forms för Tablet PC, Plattformen Tablet PC COM och WPF-plattformen (Windows Presentation Foundation). Windows Forms- och COM-plattformarna delar en liknande objektmodell, men objektmodellen för WPF-plattformen skiljer sig avsevärt åt. I det här avsnittet beskrivs skillnaderna på hög nivå så att utvecklare som har arbetat med en objektmodell bättre kan förstå den andra.

Aktivera pennanteckning i ett program

Alla tre plattformarna skickar objekt och kontroller som gör det möjligt för ett program att ta emot indata från en surfplatta. Windows Forms- och COM-plattformarna levereras med Microsoft.Ink.InkPicture, Microsoft.Ink.Ink.InkEdit, Microsoft.Ink.InkOverlay och Microsoft.Ink.InkCollector klasser. Microsoft.Ink.InkPicture och Microsoft.Ink.InkEdit är kontroller som du kan lägga till i ett program för att samla in pennanteckningar. Microsoft.Ink.InkOverlay och Microsoft.Ink.InkCollector kan kopplas till ett befintligt fönster för att möjliggöra bläckfunktion i windows och anpassade kontroller.

WPF-plattformen innehåller InkCanvas kontroll. Du kan lägga till en InkCanvas i din applikation och börja samla in bläck omedelbart. Med InkCanvaskan användaren kopiera, välja och ändra storlek på pennanteckningar. Du kan lägga till andra kontroller i InkCanvasoch användaren kan även skriva över kontrollerna. Du kan skapa en bläckaktiverad anpassad kontroll genom att lägga till en InkPresenter till kontrollen och samla in stylus-punkterna.

I följande tabell visas var du kan lära dig mer om att aktivera pennanteckningar i ett program:

För att göra det här... På WPF-plattformen... På Windows Forms/COM-plattformarna...
Lägga till en pennanteckningsaktiverad kontroll i ett program Se Komma igång med Ink. Se exempel på skadeanmälans blankett för automobiler
Aktivera pennanteckning på ett anpassat kontrollelement Se Skapa en bläckinskriftskontroll. Se Ink UrklippExempel.

Bläckdata

På Windows Forms- och COM-plattformarna Microsoft.Ink.InkCollector, Microsoft.Ink.InkOverlay, Microsoft.Ink.InkEditoch Microsoft.Ink.InkPicture var och en exponerar ett Microsoft.Ink.Ink-objekt. Objektet Microsoft.Ink.Ink innehåller data för en eller flera Microsoft.Ink.Stroke objekt och erbjuder vanliga metoder och egenskaper för att hantera och manipulera dessa linjer. Objektet Microsoft.Ink.Ink hanterar livslängden för de linjer som det innehåller. objektet Microsoft.Ink.Ink skapar och tar bort de linjer som det äger. Varje Microsoft.Ink.Stroke har en identifierare som är unik inom dess överordnade Microsoft.Ink.Ink-objekt.

På WPF-plattformen äger och hanterar klassen System.Windows.Ink.Stroke sin egen livslängd. En grupp med Stroke objekt kan samlas in i en StrokeCollection, som tillhandahåller metoder för vanliga åtgärder för hantering av pennanteckningar, till exempel träfftestning, radering, transformering och serialisering av pennanteckningar. En Stroke kan tillhöra noll, ett eller flera StrokeCollection objekt när som helst. I stället för att ha ett Microsoft.Ink.Ink-objekt innehåller InkCanvas och InkPresenter en System.Windows.Ink.StrokeCollection.

Följande bildpar jämför objektmodellerna för pennanteckningsdata. På Windows Forms- och COM-plattformarna begränsar objektet Microsoft.Ink.Ink livslängden för Microsoft.Ink.Stroke- objekten, och stylusens paket tillhör de enskilda strecken. Två eller flera linjer kan referera till samma Microsoft.Ink.DrawingAttributes objekt, som du ser i följande bild.

Diagram över bläckobjektmodellen för COM/Winforms.

På WPF är varje System.Windows.Ink.Stroke ett vanligt språkkörningsobjekt som finns så länge något har en referens till det. Varje Stroke refererar till ett StylusPointCollection- och System.Windows.Ink.DrawingAttributes-objekt, som också är vanliga språkkörningsobjekt.

Diagram över bläckobjektmodellen för WPF.

I följande tabell jämförs hur du utför några vanliga uppgifter på WPF-plattformen och Windows Forms- och COM-plattformarna.

Aktivitet Windows Presentation Foundation Windows Forms och COM
Spara bläck Save Microsoft.Ink.Ink.Save
Läs in bläck Skapa en StrokeCollection med konstruktorn StrokeCollection. Microsoft.Ink.Ink.Load
Träfftest HitTest Microsoft.Ink.Ink.HitTest
Kopiera bläck CopySelection Microsoft.Ink.Ink.ClipboardCopy
Klistra in pennanteckning Paste Microsoft.Ink.Ink.ClipboardPaste
Få åtkomst till anpassade egenskaper för en samling linjer AddPropertyData (egenskaperna lagras internt och nås via AddPropertyData, RemovePropertyDataoch ContainsPropertyData) Använd Microsoft.Ink.Ink.ExtendedProperties

Dela pennanteckning mellan plattformar

Även om plattformarna har olika objektmodeller för pennanteckningsdata är det mycket enkelt att dela data mellan plattformarna. I följande exempel sparas pennanteckningar från ett Windows Forms-program och pennanteckningen läses in i ett Windows Presentation Foundation-program.

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

I följande exempel sparas pennanteckning från ett Windows Presentation Foundation-program och pennanteckningen läses in i ett Windows Forms-program.

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

Händelser från surfplattepennan

Microsoft.Ink.InkOverlay, Microsoft.Ink.InkCollectoroch Microsoft.Ink.InkPicture på Windows Forms- och COM-plattformarna tar emot händelser när användaren matar in penndata. Microsoft.Ink.InkOverlay eller Microsoft.Ink.InkCollector är ansluten till ett fönster eller en kontroll och kan prenumerera på händelser som genereras av surfplattans indata. Tråden som dessa händelser inträffar på beror på om händelserna utlöses med en penna, en mus eller programmatiskt. Mer information om trådning i förhållande till dessa händelser finns i Allmänna Trådöverväganden och trådar på vilka en händelse kan utlösas.

På Windows Presentation Foundation-plattformen har klassen UIElement händelser för penninmatning. Det innebär att varje kontroll exponerar alla stylushändelser. Pennans händelser har tunnel-/bubbling-händelsepar och förekommer alltid i programtråden. Mer information finns i Översikt över routade händelser.

Följande diagram visar och jämför objektmodeller för de klasser som genererar pennhändelser. Windows Presentation Foundation-objektmodellen visar bara bubblande händelser, inte tunnelhändelsens motsvarigheter.

diagram över Stylus-händelserna i WPF jämfört med Winforms.

Penndata

Alla tre plattformarna ger dig sätt att fånga upp och manipulera data som kommer in från en surfplatta. På Windows Forms- och COM-plattformarna uppnås detta genom att skapa en Microsoft.StylusInput.RealTimeStylus, koppla ett fönster eller en kontroll till det och skapa en klass som implementerar Microsoft.StylusInput.IStylusSyncPlugin eller Microsoft.StylusInput.IStylusAsyncPlugin-gränssnittet. Det anpassade plugin-programmet läggs sedan till i plugin-samlingen för Microsoft.StylusInput.RealTimeStylus. Mer information om den här objektmodellen finns i Arkitekturen för StylusInput-API:erna.

På WPF-plattformen exponerar klassen UIElement en samling insticksprogram, som har en design liknande Microsoft.StylusInput.RealTimeStylus. Om du vill fånga upp penndata skapar du en klass som ärver från StylusPlugIn och lägger till objektet i StylusPlugIns-samlingen av UIElement. Mer information om den här interaktionen finns i Fånga indata från pennan.

På alla plattformar tar en trådpool emot bläckdata via stylosevenemang och skickar dem till programtråden. Mer information om trådning på COM- och Windows-plattformar finns i Threading Considerations för StylusInput-API. Mer information om trådning i Windows Presentation Software finns i The Ink Threading Model.

Följande bild jämför objektmodellerna för de klasser som tar emot penndata i penntrådspoolen.

diagram över StylusPlugin-modellen WPF vs Winforms.