基本上有三個支援數位筆跡的平台:平板電腦 Windows Forms 平台、平板電腦 COM 平台,以及 Windows Presentation Foundation (WPF) 平台。 Windows Forms 和 COM 平台共用類似的物件模型,但 WPF 平台的物件模型有較大的差異。 本主題將從高層次討論兩者的差異,讓使用過其中一種物件模型的開發人員可以更了解另一種物件模型。
在應用程式中啟用筆跡
這三種平台都提供物件與控制項,讓應用程式接收手寫筆的輸入。 Windows Forms 和 COM 平台隨附 Microsoft.Ink.InkPicture、Microsoft.Ink.InkEdit、Microsoft.Ink.InkOverlay 和 Microsoft.Ink.InkCollector 類別。 Microsoft.Ink.InkPicture 和 Microsoft.Ink.InkEdit 是可新增至應用程式以收集筆跡的控制項。 Microsoft.Ink.InkOverlay 和 Microsoft.Ink.InkCollector 可附加至現有視窗,以啟用筆跡功能的視窗和自訂控制項。
WPF 平台包含 InkCanvas 控制項。 您可以將 InkCanvas 新增至您的應用程式,立即開始收集筆跡。 透過 InkCanvas,使用者可以複製、選取及調整筆跡大小。 您可以在 InkCanvas 中加入其他控制項,使用者也可以在這些控制項上手寫。 您可以新增 InkPresenter 並建立啟用筆跡功能的自訂控制項,收集其手寫筆筆跡點。
下表列出了解應用程式中啟用筆跡的更多資源:
| 作法 | 在 WPF 平台上… | 在 Windows Forms/COM 平台上… |
|---|---|---|
| 將啟用筆跡功能的控制項新增至應用程式 | 請參閱開始使用筆跡。 | 請參閱自動宣告表單範例 |
| 啟用自訂控制項上的筆跡功能 | 請參閱建立筆跡輸入控制項。 | 請參閱筆跡剪貼簿範例。 |
筆跡資料
在 Windows Forms 和 COM 平台、Microsoft.Ink.InkCollector、Microsoft.Ink.InkOverlay、Microsoft.Ink.InkEdit 和 Microsoft.Ink.InkPicture 各公開一個 Microsoft.Ink.Ink 物件。 Microsoft.Ink.Ink 物件包含一個以上 Microsoft.Ink.Stroke 物件的資料,並公開常用的方法和屬性來管理和操作這些筆劃。 Microsoft.Ink.Ink 物件會管理其包含的筆劃存留期;Microsoft.Ink.Ink 物件會建立和刪除其擁有的筆劃。 每個 Microsoft.Ink.Stroke 在其 Microsoft.Ink.Ink 父物件內都有一個唯一的識別碼。
在 WPF 平台上,System.Windows.Ink.Stroke 類別會擁有並管理自己的存留期。 一組 Stroke 物件可以集合在一個 StrokeCollection 中,提供常用筆跡資料管理作業的方法,例如點擊測試、清除、轉換和序列化筆跡。 Stroke 可以隨時屬於零個、一個或多個 StrokeCollection 物件。 InkCanvas 和 InkPresenter 包含一個 System.Windows.Ink.StrokeCollection ,而非 Microsoft.Ink.Ink 物件。
下方兩張圖比較了筆跡資料物件模型。 在 Windows Forms 和 COM 平台上,Microsoft.Ink.Ink 物件會限制 Microsoft.Ink.Stroke 物件的存留期,而手寫筆封包屬於個別筆劃。 兩個或更多筆劃可以引用相同的 Microsoft.Ink.DrawingAttributes 物件,如下圖所示。
COM/Winforms 的筆跡物件模型圖表。Ink_InkOwnsStrokes
在 WPF 上,每個 System.Windows.Ink.Stroke 都是一個通用語言執行平台物件,只要有被引用,就會存在。 每個 Stroke 都會引用 StylusPointCollection 和 System.Windows.Ink.DrawingAttributes 物件,這些物件也是通用語言執行平台物件。
WPF 筆跡物件模型圖表。Ink_WPFInkObjectModel
下表比較如何在 WPF 平台及 Windows Forms 和 COM 平台上完成一些常見的工作。
| 任務 | Windows Presentation Foundation | Windows Forms 和 COM |
|---|---|---|
| 儲存筆跡 | Save | Microsoft.Ink.Ink.Save |
| 讀取筆跡 | 透過 StrokeCollection 建構函式建立 StrokeCollection。 | Microsoft.Ink.Ink.Load |
| 點擊測試 | HitTest | Microsoft.Ink.Ink.HitTest |
| 複製筆跡 | CopySelection | Microsoft.Ink.Ink.ClipboardCopy |
| 貼上筆跡 | Paste | Microsoft.Ink.Ink.ClipboardPaste |
| 存取筆劃集合上的自訂屬性 | AddPropertyData (屬性儲存於內部並透過 AddPropertyData、RemovePropertyData 和 ContainsPropertyData 存取) | 使用 Microsoft.Ink.Ink.ExtendedProperties |
跨平台共用筆跡
雖然各平台對於筆跡資料有不同的物件模型,但平台之間可輕鬆共用資料。 以下範例會從 Windows Forms 應用程式儲存筆跡,並將筆跡載入 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
以下範例會從 Windows Presentation Foundation 應用程式儲存筆跡,並將筆跡載入 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
平板電腦手寫筆的事件
Windows Forms 和 COM 平台上的 Microsoft.Ink.InkOverlay、Microsoft.Ink.InkCollector 和 Microsoft.Ink.InkPicture 會在使用者輸入手寫筆資料時接收事件。 Microsoft.Ink.InkOverlay 或 Microsoft.Ink.InkCollector 附加於視窗或控制項,並可訂閱平板電腦輸入資料所觸發的事件。 這些事件發生的執行緒取決於事件是透過手寫筆、滑鼠還是以程式方式所觸發。 想了解更多這些事件執行緒的相關資訊,請參閱一般執行緒考量和事件可以引發的執行緒。
在 Windows Presentation Foundation 平台上,UIElement 類別具有手寫筆輸入事件。 這表示每個控制項都會公開完整的手寫筆事件集。 手寫筆事件具有通道/反昇事件組,且一律發生在應用程式執行緒上。 如需詳細資訊,請參閱路由事件概觀。
下圖比較引發手寫筆事件的類別物件模型。 Windows Presentation Foundation 物件模型只會顯示反升事件,而非相應的通道事件。
WPF 和 Winforms 中手寫筆事件的比較圖表。Ink_StylusEvents
手寫筆資料
這三種平台都提供截取和操作手寫筆輸入資料的方法。 在 Windows Forms 和 COM 平台上,可透過建立 Microsoft.StylusInput.RealTimeStylus、附加視窗或控制項,以及建立實作 Microsoft.StylusInput.IStylusSyncPlugin 或 Microsoft.StylusInput.IStylusAsyncPlugin 介面的類別來達成。 接著自訂外掛程式會加入 Microsoft.StylusInput.RealTimeStylus 的外掛程式集。 想了解更多此物件模型的相關資訊,請參閱 StylusInput API 結構。
在 WPF 平台上,UIElement 類別公開了一組外掛程式,與 Microsoft.StylusInput.RealTimeStylus 的設計類似。 若要截取手寫筆資料,請建立繼承 StylusPlugIn 的類別並將該物件新增至 UIElement 的 StylusPlugIns 集合。 想了解更多此互動的相關資訊,請參閱截取手寫筆輸入。
在所有平台上,執行緒集區都會透過手寫筆事件接收筆跡資料,並將其發送到應用程式執行緒。 想了解更多 COM 和 Windows 平台執行緒的相關資訊,請參閱 StylusInput API 的執行緒考量。 想了解更多 Windows Presentation 軟體的相關資訊,請參閱數位筆跡執行緒模型。
下圖比較了在手寫筆執行緒集區上接收手寫筆資料的類別物件模型。
WPF 和 Winforms 中 StylusPlugin 模型的比較圖表。Ink_StylusPlugins