Compartilhar via


O modelo de objeto Ink: Windows Forms e COM versus WPF

Existem essencialmente três plataformas que suportam tinta digital: a plataforma Tablet PC Windows Forms, a plataforma COM Tablet PC e a plataforma Windows Presentation Foundation (WPF). As plataformas Windows Forms e COM compartilham um modelo de objeto semelhante, mas o modelo de objeto para a plataforma WPF é substancialmente diferente. Este tópico discute as diferenças em um alto nível para que os desenvolvedores que trabalharam com um modelo de objetos possam entender o outro.

Habilitando o Ink em um aplicativo

Todas as três plataformas vêm com objetos e controles que permitem que um aplicativo receba entrada de uma caneta eletrônica. As plataformas Windows Forms e COM são fornecidas com as classes Microsoft.Ink.InkPicture, Microsoft.Ink.InkEdit, Microsoft.Ink.InkOverlay e Microsoft.Ink.InkCollector. Microsoft.Ink.InkPicture e Microsoft.Ink.InkEdit são controles que você pode adicionar a um aplicativo para coletar tinta. O Microsoft.Ink.InkOverlay e o Microsoft.Ink.InkCollector podem ser anexados a uma janela existente para janelas habilitadas para tinta e controles personalizados.

A plataforma WPF inclui o InkCanvas controle. Você pode adicionar um InkCanvas ao seu aplicativo e começar a coletar tinta imediatamente. Com o , o InkCanvasusuário pode copiar, selecionar e redimensionar tinta. Você pode adicionar outros controles ao InkCanvas, e o usuário também pode escrever manualmente sobre esses controles. Você pode criar um controle personalizado habilitado para tinta adicionando um InkPresenter a ele e coletando seus pontos de caneta.

A tabela a seguir lista em que você pode saber mais sobre como habilitar a tinta em um aplicativo:

Para fazer isto… Na plataforma WPF... Nas plataformas Windows Forms/COM...
Adicionar um controle habilitado para tinta a um aplicativo Consulte Introdução à tinta. Consulte Exemplo de formulário de declarações automáticas
Habilitar tinta em um controle personalizado Consulte Criando um controle de entrada de tinta. Consulte Exemplo da área de transferência de tinta.

Dados de tinta

Nas plataformas Windows Forms e COM, Microsoft.Ink.InkCollector, Microsoft.Ink.InkOverlay, Microsoft.Ink.InkEdit e Microsoft.Ink.InkPicture expõem um objeto Microsoft.Ink.Ink. O objeto Microsoft.Ink.Ink contém os dados de um ou mais objetos Microsoft.Ink.Stroke e expõe métodos e propriedades comuns para gerenciar e manipular esses traçados. O objeto Microsoft.Ink.Ink gerencia o tempo de vida dos traçados que ele contém, o objeto Microsoft.Ink.Ink cria e exclui os traçados que ele possui. Cada Microsoft.Ink.Stroke tem um identificador que é exclusivo dentro de seu objeto pai, Microsoft.Ink.Ink .

Na plataforma WPF, a System.Windows.Ink.Stroke classe possui e gerencia sua própria vida útil. Um grupo de objetos pode ser coletado em conjunto em um StrokeCollection, que fornece métodos para operações comuns de gerenciamento de dados de tinta, como teste de Stroke ocorrência, apagamento, transformação e serialização da tinta. A Stroke pode pertencer a zero, um ou mais StrokeCollection objetos a qualquer momento. Em vez de ter um objeto Microsoft.Ink.Ink, o InkCanvas e InkPresenter contém um System.Windows.Ink.StrokeCollectionarquivo .

O par de ilustrações a seguir compara os modelos de objeto de dados de tinta. Nas plataformas Windows Forms e COM, o objeto Microsoft.Ink.Ink restringe o tempo de vida dos objetos Microsoft.Ink.Stroke e os pacotes de caneta pertencem aos traçados individuais. Dois ou mais traçados podem fazer referência ao mesmo objeto Microsoft.Ink.DrawingAttributes , conforme mostrado na ilustração a seguir.

Diagram of the Ink Object Model for COM/Winforms.

No WPF, cada System.Windows.Ink.Stroke um é um objeto de tempo de execução de linguagem comum que existe desde que algo tenha uma referência a ele. Cada Stroke um faz referência a e StylusPointCollectionSystem.Windows.Ink.DrawingAttributes objeto, que também são objetos comuns de tempo de execução de linguagem.

Diagram of the Ink Object Model for WPF.

A tabela a seguir compara como realizar algumas tarefas comuns na plataforma WPF e nas plataformas Windows Forms e COM.

Tarefa Windows Presentation Foundation Windows Forms e COM
Salvar tinta Save Microsoft.Ink.Ink.Save
Carregar tinta Crie um StrokeCollection com o StrokeCollection construtor. Microsoft.Ink.Ink.Load
Teste de clique HitTest Microsoft.Ink.Ink.HitTest
Copiar tinta CopySelection Microsoft.Ink.Ink.ClipboardCopy
Colar tinta Paste Microsoft.Ink.Ink.ClipboardPaste
Acessar propriedades personalizadas em uma coleção de traços AddPropertyData (as propriedades são armazenadas internamente e acessadas via AddPropertyData, RemovePropertyDatae ContainsPropertyData) Usar Microsoft.Ink.Ink.ExtendedProperties

Compartilhando tinta entre plataformas

Embora as plataformas tenham modelos de objeto diferentes para os dados de tinta, o compartilhamento de dados entre as plataformas é muito fácil. Os exemplos a seguir salva a tinta de um aplicativo Windows Forms e carregam a tinta em um aplicativo do 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

Os exemplos a seguir salvam a tinta de um aplicativo Windows Presentation Foundation e carregam a tinta em um aplicativo dos 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

Eventos da caneta eletrônica

O Microsoft.Ink.InkOverlay, Microsoft.Ink.InkCollector e Microsoft.Ink.InkPicture nas plataformas Windows Forms e COM recebem eventos quando o usuário insere dados de caneta. O Microsoft.Ink.InkOverlay ou Microsoft.Ink.InkCollector é anexado a uma janela ou um controle e pode assinar os eventos gerados pelos dados de entrada do tablet. O thread em que esses eventos ocorrem depende de se os eventos são gerados com uma caneta, um mouse ou programaticamente. Para obter mais informações sobre o uso de threads em relação a esses eventos, consulte Considerações gerais de thread e Threads nos quais um evento pode ser acionado.

Na plataforma Windows Presentation Foundation, a UIElement classe tem eventos para entrada de caneta. Isso significa que cada controle expõe o conjunto completo de eventos de caneta. Os eventos de caneta têm pares de eventos de túnel/propagação e sempre ocorrem no thread do aplicativo. Para obter mais informações, consulte Visão geral de eventos roteados.

O diagrama a seguir compara os modelos de objeto para as classes que geram eventos de caneta. O modelo de objeto do Windows Presentation Foundation mostra somente os eventos de propagação, não os equivalentes do evento de túnel.

Diagram of the Stylus events in WPF vs Winforms.

Dados da caneta

Todas as três plataformas fornecem meios para interceptar e manipular os dados provenientes de uma caneta eletrônica. Nas plataformas Windows Forms e COM, isso é obtido criando uma interface Microsoft.StylusInput.RealTimeStylus, anexando uma janela ou controle a ela e criando uma classe que implementa a interface Microsoft.StylusInput.IStylusSyncPlugin ou Microsoft.StylusInput.IStylusAsyncPlugin. O plug-in personalizado é então adicionado à coleção de plug-ins do Microsoft.StylusInput.RealTimeStylus. Para obter mais informações sobre esse modelo de objeto, consulte Arquitetura de APIs StylusInput.

Na plataforma WPF, a UIElement classe expõe uma coleção de plug-ins, semelhante em design ao Microsoft.StylusInput.RealTimeStylus. Para interceptar dados de caneta, crie uma classe que herde de StylusPlugIn e adicione o objeto à StylusPlugIns coleção do UIElement. Para obter mais informações sobre essa interação, consulte Interceptando a entrada da caneta.

Em todas as plataformas, um pool de threads recebe os dados de tinta por eventos de caneta e o envia para o thread do aplicativo. Para obter mais informações sobre uso de threads nas plataformas Windows e COM, consulte Considerações de thread para APIs StylusInput. Para obter mais informações sobre uso de threads no software Windows Presentation, consulte O modelo de threading de tinta.

A ilustração a seguir compara os modelos de objeto para as classes que recebem dados da caneta no pool de threads de caneta.

Diagram of the StylusPlugin model WPF vs Winforms.