Share via


Visão geral sobre arrastar e soltar

Este tópico fornece uma visão geral do suporte a arrastar e soltar em aplicativos Windows Presentation Foundation (WPF). Arrastar e soltar normalmente se refere a um método de interação com a interface do usuário (UI) que envolve o uso de um mouse (ou algum outro dispositivo apontador) para selecionar um ou mais objetos, arrastar esses objetos sobre algum destino desejado na interface do usuário e soltá-los.

Este tópico contém as seguintes seções.

  • Suporte a arrastar e soltar no WPF
  • Dados e objetos de dados
  • Eventos de arrastar e soltar
  • Trabalhando com objetos de dados
  • Tópicos relacionados

Suporte a arrastar e soltar no WPF

Operações de do tipo arrastar e soltar normalmente envolvem duas partes: uma fonte de arrastar da qual o objeto arrastado tem origem e um destino liberado que recebe o objeto solto. A fonte e o alvo podem ser o mesmo aplicativo ou um aplicativo diferente.

O tipo e o número de objetos que podem ser manipulados via arrastar e soltar é completamente arbitrário; um ou mais arquivos ou pastas e seleções de conteúdo são alguns dos objetos mais comuns manipulados por meio de operações de arrastar e soltar. As ações específicas executadas durante uma operação de arrastar e soltar são específicas dos aplicativos e frequentemente determinadas pelo contexto. Por exemplo, arrastar uma seleção de arquivos de uma pasta para outra no mesmo dispositivo de armazenamento por padrão move os arquivos, enquanto arrastar arquivos de um compartilhamento Convenção de nomenclatura universal (UNC) para uma pasta local por padrão copia os arquivos. As funcionalidades de arrastar e soltar fornecidas pelo WPF são criadas para ser altamente flexíveis e personalizáveis para dar suporte a uma ampla variedade de cenários de arrastar e soltar. Arrastar e soltar oferece suporte à manipulação de objetos dentro de um único aplicativo ou entre diferentes aplicativos; arrastar e soltar entre aplicativos WPF e outros aplicativos Windows também é totalmente suportado. Arrastar e soltar se encaixa na área mais genérica de transferência de dados; além de arrastar e soltar, a transferência de dados também inclui o uso da área de transferência do sistema para operações de cópia e colagem.

Observação de segurança: OLE do tipo arrastar e soltar não funciona enquanto na zona da internet.

Dados e objetos de dados

Os dados que são transferidos como parte de uma operação de arrastar e soltar são armazenados em um objeto de dados. Conceitualmente, um objeto de dados consiste em um ou mais pares de:

  • Um Object que contém os dados reais, e

  • Um identificador de formato de dados correspondente.

Os dados propriamente ditos podem consistir de qualquer coisa que possa ser representada como um Object base. O formato de dados correspondente é uma seqüência de caracteres ou Type que fornece uma dica sobre o formato de dados está em. Suportam a objetos de dados que hospeda vários pares (formato de dados) de dados-; Isso permite que um objeto de dados único fornecer dados em vários formatos.

Todos os objetos de dados devem implementar a interface IDataObject que fornece o seguinte conjunto padrão de métodos que permitem e facilitam a transferência de dados.

Método

Resumo

GetData

Recupera um objeto de dados em um formato de dados especificado.

GetDataPresent

Faz uma verificação para averiguar se os dados estão disponíveis no, ou podem ser convertidos para, um formato especificado.

GetFormats

Retorna uma lista dos formatos em que os dados neste objeto de dados estão armazenados, ou em que podem ser convertidos.

SetData

Armazena os dados especificados neste objeto de dados.

O WPF fornece uma implementação básica de IDataObject na classe DataObject; a classe DataObject é suficiente para muitos cenários comuns de transferência de dados.

Para obter informações sobre os formatos de dados predefinidos fornecidos pelo WPF, consulte o tópico de referência da classe DataFormats.

Objetos de dados normalmente incluem um recurso para converter automaticamente dados armazenados em um formato para um formato diferente ao extrair os dados; esse recurso é chamado de autoconversão.

Ao consultar os formatos de dados disponíveis em um objeto de dados, formatos de dados autoconversíveis podem ser filtrados a partir de formatos de dados nativos chamando o método GetFormats(Boolean) ou o método GetDataPresent(String, Boolean) e especificando o parâmetro autoConvert como false. Ao adicionar dados a um objeto de dados com o método SetData(String, Object, Boolean), a conversão automática de dados pode ser proibida definindo o parâmetro autoConvert como false.

Eventos de arrastar e soltar

Operações de arrastar e soltar suportam um modelo orientado a eventos. Tanto a fonte quanto o alvo da operação usam um conjunto padrão de eventos para tartar operações de arrastar e soltar. As tabelas a seguir resumem os eventos padrão de arrastar e soltar.

Eventos da fonte dos elementos arrastados

Evento

Resumo

GiveFeedback

Esse evento ocorre quando uma operação de arrastar e soltar é iniciada e permite que o destino alvo da operação de soltar envie informações para a fonte; essas informações são comumente usadas pela fonte da operação para ajustar dinamicamente a aparência do ponteiro do mouse para fornecer alguma informação para o usuário. Este é um evento bolha (propagável para cima na hierarquia de contêineres).

QueryContinueDrag

Esse evento ocorre quando há uma alteração no teclado ou no estado dos botões do mouse durante uma operação de arrastar e soltar e permite que o alvo da operação soltar cancele a operação de arrastar e soltar dependendo dos estados das teclas e botões. Este é um evento bolha.

PreviewGiveFeedback

Versão de tunelamento (propagável do elemento raiz na hhierarquia até o nó que o gerou) do evento GiveFeedback.

PreviewQueryContinueDrag

Versão de tunelamento do evento QueryContinueDrag.

Eventos do destino alvo

Evento

Resumo

DragEnter

Esse evento ocorre quando um objeto é arrastado para dentro dos limites do alvo da operação. Este é um evento bolha.

DragLeave

Esse evento ocorre quando um objeto é arrastado para fora dos limites do alvo da operação. Este é um evento bolha.

DragOver

Esse evento ocorre quando um objeto é arrastado (se move) dentro dos limites do alvo da operação. Este é um evento bolha.

Drop

Esse evento ocorre quando um objeto é solto no destino alvo. Este é um evento bolha.

PreviewDragEnter

Versão de tunelamento do evento DragEnter.

PreviewDragLeave

Versão de tunelamento do evento DragLeave.

PreviewDragOver

Versão de tunelamento do evento DragOver.

PreviewDrop

Versão de tunelamento do evento Drop.

Trabalhando com objetos de dados

Esta seção descreve as técnicas mais comuns para criar e trabalhar com objetos de dados.

Usando os construtores DataObject

A classe DataObject fornece vários construtores sobrecarregados que facilitam o preenchimento de uma nova instância de DataObject com um par de dados-(formato de dados).

O código de exemplo a seguir cria um novo objeto de dados e usa um dos construtores sobrecarregados (DataObject(String, Object)) para inicializar o objeto de dados com uma string e um formato de dados especificado. Nesse caso o formato de dados é especificado por uma string; a classe DataFormats fornece um conjunto de strings de tipo pré-definidas. Conversão automática dos dados armazenados é permitida por padrão.

string stringData = "Some string data to store...";
string dataFormat = DataFormats.UnicodeText;
DataObject dataObject = new DataObject(dataFormat, stringData);

Para obter mais exemplos de código que criam um objeto de dados, consulte Como: Create a Data Object.

Armazenando dados em vários formatos

Um único objeto de dados é capaz de armazenar dados em vários formatos. O uso estratégico de vários formatos de dados em um único objeto de dados potencialmente torna o objeto de dados consumível por uma maior diversidade de destinos alvo do que se apenas um formato de dados único pudesse ser representado. Observe que, em geral, uma fonte não deve precisar conhecer os formatos de dados que são consumíveis por possíveis alvos.

O exemplo a seguir mostra como usar o método SetData(String, Object) para adicionar dados a um objeto de dados em vários formatos.

DataObject dataObject = new DataObject();
string sourceData = "Some string data to store...";

// Encode the source string into Unicode byte arrays.
byte[] unicodeText = Encoding.Unicode.GetBytes(sourceData); // UTF-16
byte[] utf8Text = Encoding.UTF8.GetBytes(sourceData);
byte[] utf32Text = Encoding.UTF32.GetBytes(sourceData);

// The DataFormats class does not provide data format fields for denoting
// UTF-32 and UTF-8, which are seldom used in practice; the following strings 
// will be used to identify these "custom" data formats.
string utf32DataFormat = "UTF-32";
string utf8DataFormat  = "UTF-8";

// Store the text in the data object, letting the data object choose
// the data format (which will be DataFormats.Text in this case).
dataObject.SetData(sourceData);
// Store the Unicode text in the data object.  Text data can be automatically
// converted to Unicode (UTF-16 / UCS-2) format on extraction from the data object; 
// Therefore, explicitly converting the source text to Unicode is generally unnecessary, and
// is done here as an exercise only.
dataObject.SetData(DataFormats.UnicodeText, unicodeText);
// Store the UTF-8 text in the data object...
dataObject.SetData(utf8DataFormat, utf8Text);
// Store the UTF-32 text in the data object...
dataObject.SetData(utf32DataFormat, utf32Text);

Consultando um objeto de dados sobre os formatos disponíveis

Como um único objeto de dados pode conter um número arbitrário de formatos de dados, objetos de dados incluem recursos para retornar uma lista de formatos de dados disponíveis.

O seguinte exemplo de código usa a sobrecarga GetFormats para obter um array de strings que indica todos os formatos de dados disponíveis em um objeto de dados (nativo e autoconversível).

DataObject dataObject = new DataObject("Some string data to store...");

// Get an array of strings, each string denoting a data format
// that is available in the data object.  This overload of GetDataFormats
// returns all available data formats, native and auto-convertible.
string[] dataFormats = dataObject.GetFormats();

// Get the number of data formats present in the data object, including both
// auto-convertible and native data formats.
int numberOfDataFormats = dataFormats.Length;

// To enumerate the resulting array of data formats, and take some action when
// a particular data format is found, use a code structure similar to the following.
foreach (string dataFormat in dataFormats)
{
    if (dataFormat == DataFormats.Text)
    {
        // Take some action if/when data in the Text data format is found.
        break;
    }
    else if(dataFormat == DataFormats.StringFormat)
    {
        // Take some action if/when data in the string data format is found.
        break;
    }
}

Para obter mais exemplos de código de consulta a um objeto de dados sobre formatos de dados disponíveis, consulte Como: List the Data Formats in a Data Object. Para obter exemplos de consulta a um objeto de dados em busca da presença de um formato específico de dados, consulte Como: Determine if a Data Format is Present in a Data Object.

Recuperando dados de um objeto de dados

A recuperação de dados de uma objeto de dados em um determinado formato envolve simplesmente chamar um dos métodos GetData e especificar o formato de dados desejado. Um dos métodos GetDataPresent pode ser usado para verificar a presença de um formato de dados específico. GetData retorna os dados em um Object; dependendo do formato de dados, esse objeto pode ser convertido em um contêiner de um tipo específico.

O código exemplo a seguir usa a sobrecarga de GetDataPresent(String) para primeiro verificar se um formato de dados especificado está disponível (originalmente ou por conversão automática). Se o formato especificado estiver disponível, o exemplo recupera os dados usando o método GetData(String).

DataObject dataObject = new DataObject("Some string data to store...");

string desiredFormat = DataFormats.UnicodeText;
byte[] data = null;

// Use the GetDataPresent method to check for the presence of a desired data format.
// This particular overload of GetDataPresent looks for both native and auto-convertible 
// data formats.
if (dataObject.GetDataPresent(desiredFormat))
{
    // If the desired data format is present, use one of the GetData methods to retrieve the
    // data from the data object.
    data = dataObject.GetData(desiredFormat) as byte[];
}

Para obter mais exemplos de código que recuperem dados de um objeto de dados, consulte Como: Recuperar Dados em um Formato de Dados Específico.

Removendo dados de um objeto de dados

Dados não podem ser removidos diretamente de um objeto de dados. Para remover efetivamente os dados de um objeto de dados, execute estas etapas sugeridas:

 

  1. Crie um novo objeto de dados que irá conter somente os dados que você deseja manter.

  2. Copie os dados desejados do objeto de dados antigo para o novo objeto de dados. Para copiar os dados, use um dos métodos GetData para recuperar um Object que contém os dados brutos e use um dos métodos SetData para adicionar os dados ao novo objeto de dados.

  3. Substitua o objeto de dados antigo pelo novo.

 

ObservaçãoObservação:

O SetData métodos apenas adicionar dados a um objeto de dados; elas não substituam dados, mesmo se sistema autônomo dados e o formato de dados forem exatamente iguais sistema autônomo uma telefonar anterior. Chamar SetData duas vezes para os mesmos dados & formato de dados resultará no par dados-(formato de dados) sendo presente duas vezes no objeto de dados.

Consulte também

Referência

Clipboard

Outros recursos

Arrastar e Soltar exemplos

Tópicos de "Como Fazer" Arrastar e soltar

Drag and Drop