Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Es gibt im Prinzip drei Plattformen, die Freihandeingaben unterstützen: die Tablet PC Windows Forms-Plattform, die Tablet PC COM-Plattform und die Windows Presentation Foundation (WPF)-Plattform. Die Windows Forms- und die COM-Plattform haben ein ähnliches Objektmodell gemeinsam, das Objektmodell der WPF-Plattform unterscheidet sich jedoch wesentlich. In diesem Thema werden die Unterschiede allgemein erläutert, damit Entwickler, die bereits mit einem Objektmodell gearbeitet haben, das andere besser verstehen können.
Ermöglichen von Freihandeingaben in einer Anwendung
Alle drei Plattformen enthalten Objekte und Steuerelemente, die es einer Anwendung ermöglichen, Eingaben von einem Tablettstift zu empfangen. Die Windows Forms- und die COM-Plattform enthalten die Klassen InkPicture, InkEdit, InkOverlay und InkCollector. Das InkPicture-Steuerelement und das InkEdit-Steuerelement können einer Anwendung zum Erfassen von Freihandeingaben hinzugefügt werden. InkOverlay und InkCollector können an ein vorhandenes Fenster angefügt werden, um Freihandeingaben in Fenstern und benutzerdefinierten Steuerelementen zu ermöglichen.
Die WPF-Plattform enthält das InkCanvas-Steuerelement. Sie können Ihrer Anwendung ein InkCanvas-Steuerelement hinzufügen und sofort Freihandeingaben erfassen. Mit InkCanvas kann der Benutzer Freihandeingaben kopieren, auswählen und deren Größe ändern. Sie können InkCanvas weitere Steuerelemente hinzufügen. Der Benutzer kann auch über diese Steuerelemente handschriftliche Eingaben vornehmen. Sie können ein benutzerdefiniertes Steuerelement für Freihandeingaben erstellen, indem Sie dem Steuerelement InkPresenter hinzufügen und die Tablettstiftpunkte erfassen.
In der folgenden Tabelle ist aufgeführt, wo Sie mehr Informationen zum Ermöglichen von Freihandeingaben in einer Anwendung finden:
Aktion |
Auf der WPF-Plattform… |
Auf der Windows Forms- / COM-Plattform… |
|---|---|---|
Hinzufügen eines Steuerelements für Freihandeingaben zu einer Anwendung |
Weitere Informationen finden Sie unter Erste Schritte mit Freihandeingaben. |
Weitere Informationen finden Sie unter Auto Claims Form Sample. |
Ermöglichen von Freihandeingaben in einem benutzerdefinierten Steuerelement |
Weitere Informationen finden Sie unter Erstellen eines Freihandeingabesteuerelements. |
Weitere Informationen finden Sie unter Ink Clipboard Sample. |
Freihanddaten
Auf der Windows Forms- und der COM-Plattform machen InkCollector, InkOverlay, InkEdit und InkPicture jeweils ein Ink-Objekt verfügbar. Das Ink-Objekt enthält die Daten für mindestens ein Stroke-Objekt und macht allgemeine Methoden und Eigenschaften zum Verwalten und Ändern dieser Striche verfügbar. Das Ink-Objekt verwaltet die Lebensdauer der enthaltenen Striche. Das Ink-Objekt erstellt und löscht die Striche, deren Besitzer es ist. Jedes Stroke-Objekt verfügt über einen Bezeichner, der innerhalb des übergeordneten Ink-Objekts eindeutig ist.
Auf der WPF-Plattform besitzt und verwaltet die System.Windows.Ink.Stroke-Klasse ihre eigene Lebensdauer. Eine Gruppe von Stroke-Objekten kann in einer StrokeCollection-Auflistung zusammengefasst werden, die Methoden für allgemeine Verwaltungsvorgänge für Freihanddaten bereitstellt, z. B. Trefferüberprüfung, Löschen, Umwandeln und Serialisieren von Freihandeingaben. Ein Stroke kann zu jedem Zeitpunkt zu keinem, einem oder mehreren StrokeCollection-Objekten gehören. Anstelle eines Ink-Objekts können InkCanvas und InkPresenter ein System.Windows.Ink.StrokeCollection-Objekt enthalten.
In den folgenden beiden Abbildungen werden die Freihanddaten-Objektmodelle miteinander verglichen. Auf der Windows Forms- und der COM-Plattform schränkt das Ink-Objekt die Lebensdauer der Stroke-Objekte ein, und die Tablettstiftpakete gehören zu den einzelnen Strichen. Zwei oder mehr Striche können auf dasselbe DrawingAttributes-Objekt verweisen, wie in der folgenden Abbildung dargestellt.
.png)
In WPF ist jedes System.Windows.Ink.Stroke-Objekt ein Common Language Runtime-Objekt, das existiert, so lange ein Verweis darauf vorhanden ist. Jedes Stroke-Objekt verweist auf ein StylusPointCollection-Objekt und ein System.Windows.Ink.DrawingAttributes-Objekt, die ebenfalls Common Language Runtime-Objekte sind.
.png)
In der folgenden Tabelle wird verglichen, wie einige häufige Aufgaben auf der WPF-Plattform und auf der Windows Forms- und COM-Plattform durchgeführt werden.
Aufgabe |
Windows Presentation Foundation |
Windows Forms und COM |
|---|---|---|
Freihandeingabe speichern |
Save() |
|
Freihandeingabe laden |
Erstellen Sie ein StrokeCollection-Objekt mit dem StrokeCollection.StrokeCollection(Stream)-Konstruktor. |
Load(Byte[]) |
Trefferüberprüfung |
HitTest() |
|
Freihandeingabe kopieren |
ClipboardCopy() |
|
Freihandeingabe einfügen |
ClipboardPaste() |
|
Zugriff auf benutzerdefinierte Eigenschaften in einer Auflistung von Strichen |
AddPropertyData (Die Eigenschaften werden intern gespeichert, der Zugriff erfolgt über AddPropertyData, RemovePropertyData und ContainsPropertyData.) |
Verwenden Sie ExtendedProperties(). |
Gemeinsames Verwenden von Freihandeingaben auf verschiedenen Plattformen
Obwohl die Plattformen unterschiedliche Objektmodelle für die Freihanddaten haben, ist das gemeinsame Verwenden der Daten auf verschiedenen Plattformen sehr einfach. In den folgenden Beispielen werden Freihandeingaben aus einer Windows Forms-Anwendung gespeichert und in einer WPF (Windows Presentation Foundation)-Anwendung geladen.
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);
}
In den folgenden Beispielen werden Freihandeingaben aus einer WPF-Anwendung gespeichert und in einer Windows Forms-Anwendung geladen.
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());
}
Ereignisse vom Tablettstift
Auf der Windows Forms- und der COM-Plattform empfangen InkOverlay, InkCollector und InkPicture Ereignisse, wenn der Benutzer Stiftdaten eingibt. InkOverlay oder InkCollector wird an ein Fenster oder Steuerelement angefügt und kann die Ereignisse abonnieren, die von den Tabletteingabedaten ausgelöst werden. In welchem Thread diese Ereignisse auftreten, hängt davon ab, ob die Ereignisse mit einem Stift, einer Maus oder programmgesteuert ausgelöst werden. Weitere Informationen zu Threading in Bezug auf diese Ereignisse finden Sie unter General Threading Considerations und Threads on Which an Event Can Fire.
Auf der WPF-Plattform enthält die UIElement-Klasse Ereignisse für Stifteingaben. Dies bedeutet, dass jedes Steuerelement den vollständigen Satz von Tablettstiftereignissen verfügbar macht. Die Tablettstiftereignisse verfügen über Tunneling/Bubbling-Ereignispaare und treten immer im Anwendungsthread auf. Weitere Informationen finden Sie unter Übersicht über Routingereignisse.
In der folgenden Abbildung werden die Objektmodelle für die Klassen verglichen, die Tablettstiftereignisse auslösen. Im WPF-Objektmodell werden nur die Bubbling-Ereignisse angezeigt, nicht die zugehörigen Tunneling-Ereignisse.
.png)
Stiftdaten
Alle drei Plattformen bieten Möglichkeiten zum Erfassen und Ändern der Daten von einem Tablettstift. Auf der Windows Forms- und der COM-Plattform wird dies durch Erstellen von RealTimeStylus erreicht. Ein Fenster oder Steuerelement wird angefügt und eine Klasse erstellt, die die IStylusSyncPlugin-Schnittstelle oder die IStylusAsyncPlugin-Schnittstelle implementiert. Das benutzerdefinierte Plug-In wird dann zur Plug-In-Auflistung von RealTimeStylus hinzugefügt. Weitere Informationen über dieses Objektmodell finden Sie unter Architecture of the StylusInput APIs.
Auf der WPF-Plattform macht die UIElement-Klasse eine Auflistung von Plug-Ins verfügbar, deren Entwurf RealTimeStylus ähnelt. Zum Erfassen von Stiftdaten erstellen Sie eine von StylusPlugIn geerbte Klasse und fügen das Objekt dann zur StylusPlugIns-Auflistung von UIElement hinzu. Weitere Informationen zu dieser Interaktion finden Sie unter Abfangen von Tablettstifteingaben.
Auf allen Plattformen werden die Freihanddaten über Tablettstiftereignisse von einem Threadpool empfangen und an den Anwendungsthread gesendet. Weitere Informationen zu Threading auf der COM- und der Windows-Plattform finden Sie unter Threading Considerations for the StylusInput APIs. Weitere Informationen zu Threading in der Windows Presentation Software finden Sie unter Das Threadmodell für Freihandeingaben.
In der folgenden Abbildung werden die Objektmodelle für die Klassen verglichen, die Stiftereignisse im Threadpool für den Stift empfangen.
.png)