Inicio > Silverlight > Portapapeles Silverlight API

Silverlight API de Portapapeles

Portapapeles API de Silverlight

Silverlight 4 añade soporte Portapapeles. Echa un vistazo a las demos impresionantes de Scott Guthrie y Brian Goldfarb hoy en PDC que los escenarios de escaparate habilitados por el apoyo Silveilght4 Portapapeles.

API de Silverlight Portapapeles es un subconjunto de WPF Portapapeles API:

  Portapapeles pública clase estática 
{
pública ContainsText static bool ();
GetText public static String ();
text); SetText public void (cadena de texto);
}

Permite copiar / pegar cadenas Unicode a / desde el portapapeles del sistema. GetText y SetText requiere uno de los siguientes para tener éxito:

  1. la aplicación que llama Silverlight es una aplicación de confianza elevado, o
  2. es iniciado por el usuario y el acceso a las subvenciones de usuario portapapeles

Para el segundo caso, cuando GetText o SetText primero se llamó en un control de eventos iniciada por el usuario, Silverlight aparece un cuadro de diálogo como la siguiente (la interfaz de usuario puede cambiar en RTW):

    Clipboard Prompt
    Si el usuario hace clic, sí, Silverlight permitirá a este y más tarde las llamadas GetText / SetText para tener éxito para esta aplicación durante este período de sesiones, si el usuario hace clic, no, la opción predeterminada, Silverlight lanzar una SecurityException . En una palabra, el ajuste es por aplicación, por sesión, tanto para obtener y establecer el acceso al portapapeles del sistema, y ​​no se mantuvo.

Portapapeles de la API de JavaScript y WPF

Tenemos que considerar muchos factores, mientras que el diseño de la API Portapapeles para Silverlight. Entre ellas, la API de JavaScript Portapapeles y WPF son particularmente interesantes, porque tenemos que estudiar las lecciones de seguridad en JavaScript y tratar de ser compatible con WPF.

No hay navegadores, plataformas API de JavaScript para acceso al portapapeles. IE ofrece clipboardData objeto que permite obtener / establecer / borrar cadenas en el portapapeles del sistema:

bResult = window.clipboardData.setData (sDataFormat, sdata);

sdata = window.clipboardData.getData (sDataFormat);

bResult window.clipboardData.clearData = ([sDataFormat]);

donde sDataFormat es una cadena constante de "Texto" o "URL", sdata es una cadena, y bResult es un valor booleano.

La primera vez que el objeto clipboadData se accede, IE pedirá al usuario que permite la secuencia de comandos para acceder a portapapeles, y el ajuste es válido para la sesión.

API de WPF Portapapeles compatible con el formato más extensible y datos a través de IDataObject , y tiene funciones de ayuda para los formatos comunes como texto, imagen, audio y filedrop .

 Portapapeles pública clase estática 
{
[SecurityCritical]
public static void Clear ();

public static bool ContainsAudio ();
format); public static bool ContainsData (formato de cadena);
pública ContainsFileDropList static bool ();
public static bool ContainsImage ();
pública ContainsText static bool ();
public static bool ContainsText (formato TextDataFormat);
public static Stream GetAudioStream ();
format); public static objeto GetData (formato de cadena);
[SecurityCritical]
public static GetDataObject IDataObject ();
GetFileDropList StringCollection pública estática ();
public static BitmapSource GetImage ();
GetText public static String ();
public static string GetText (formato TextDataFormat);

pública IsCurrent static bool (IDataObject de datos);

[] audioBytes); public void SetAudio (byte [] audioBytes);
public void SetAudio (Stream audioStream);
format, object data); public void SetData (formato de cadena, los datos de objeto);
[SecurityCritical]
data); public void SetDataObject (datos de objetos);
[SecurityCritical]
data, bool copy); public void SetDataObject (datos de objetos, copiar bool);
SetFileDropList public void (fileDropList StringCollection);
public void setImage (BitmapSource imagen);
text); SetText public void (cadena de texto);
text, TextDataFormat format); public void setText (cadena de texto, TextDataFormat formato);
}

Portapapeles de la API de Windows y Mac OS X

. API de Silverlight portapapeles finalmente se implementó en la parte superior de la API de portapapeles del sistema operativo subyacente API de Windows Portapapeles están documentados en MSDN, a continuación fragmento ofrece una visión general acerca de cómo establecer / obtener los datos del portapapeles:

Corte y las operaciones de copia

Para colocar la información en el portapapeles, una ventana primero borra cualquier contenido del portapapeles anterior mediante el EmptyClipboard función. Esta función envía el WM_DESTROYCLIPBOARD mensaje al propietario del portapapeles anterior, libera los recursos asociados con los datos en el portapapeles, y asigna la propiedad portapapeles a la ventana que tiene abierta en el portapapeles. Para saber qué ventana posee el portapapeles, llame a la GetClipboardOwner función.

Después de vaciar el portapapeles, la ventana coloca los datos en el portapapeles como los formatos de portapapeles como sea posible, ordenados desde el formato del portapapeles más descriptiva hasta la menos descriptivo. Para cada formato, la ventana llama a la SetClipboardData función, especificando el identificador de formato y una manija de la memoria global. El mango de memoria puede ser NULL, lo que indica que la ventana hace que los datos a petición. Para obtener más información, consulte la representación diferida .

Operaciones de Pegar

Para recuperar la información de pegar desde el portapapeles, una primera ventana determina el formato del portapapeles para recuperar. Por lo general, una ventana se enumeran los formatos de portapapeles disponibles mediante el uso de la EnumClipboardFormats función y utiliza el primer formato lo reconoce. Este método selecciona el mejor formato disponible de acuerdo con el conjunto de prioridad cuando los datos se colocan en el portapapeles.

Alternativamente, una ventana puede utilizar el GetPriorityClipboardFormat función. Esta función identifica la mejor formato de portapapeles disponibles de acuerdo con una prioridad especificada. Una ventana que sólo reconoce un formato del portapapeles sólo puede determinar si ese formato está disponible mediante el IsClipboardFormatAvailable función.

Después de determinar el formato del portapapeles de usar, una ventana llama a la GetClipboardData función. Esta función devuelve el identificador de un objeto de memoria global que contiene los datos en el formato especificado. Una ventana puede bloquear brevemente el objeto de memoria con el fin de examinar o copiar los datos. Sin embargo, una ventana no debe liberar el objeto o dejarlo bloqueado durante un largo período de tiempo.

Por el momento, Silverlight API de portapapeles sólo es compatible con CF_UNICODETEXT formato para el texto de copiar / pegar Unicode a / desde el portapapeles.

Mac OS X utiliza el Administrador de cartón . Está documentado en el Mac Dev Center . A continuación extracto (con APIs añadido) ofrece una visión general:

La aplicación de copia es el responsable de colocar los datos copiados o cortados en la mesa de trabajo:

  1. El usuario selecciona algunos datos e invoca el Copiar (o Cortar) del menú.

  2. Si la aplicación aún no tiene una referencia a la mesa de trabajo Portapapeles, se crea una ( PasteboardCreate ).

  3. La aplicación toma la propiedad de la mesa de trabajo y borra el contenido actual ( PasteboardClear ).

  4. La aplicación asigna los identificadores de elemento de los datos seleccionados.

  5. Si hay datos que se prometió, la aplicación debe registrar un cumplidor de promesas función de callback para suministrar los datos prometidos ( PasteboardSetPromiseKeeper ).

  6. La aplicación añade una o más sabores de cada elemento a la mesa de trabajo, incluyendo tanto los datos reales de sabor o una promesa con cada sabor ( PasteboardPutItemFlavor ).

La aplicación receptora tiene un conjunto ligeramente diferente de las tareas para controlar la acción Pegar:

  1. Cuando la aplicación se activa, se comprueba si la mesa de trabajo se ha modificado ( PasteboardSynchronize ). Si es así, se obtiene un listado de los sabores en la mesa de trabajo. Si hay algunos sabores admite la aplicación, se puede habilitar la opción de menú Pegar.

  2. El usuario invoca el elemento de menú Pegar.

  3. Las solicitudes de aplicación de este artículo (o artículos) en la mesa de trabajo en los sabores que soporta

  4. Si los datos pegados se va a guardar como un archivo, la aplicación receptora debe establecer una posición de pasta antes de solicitar los datos de sabor. En cualquier otro caso, la aplicación receptora no tiene que preocuparse acerca de si los datos de la pasta se le prometió o no.

Si guarda la solicitud copia de la promesa que se llama, la devolución de llamada debe hacer lo siguiente:

  • Si los datos se va a almacenar en un archivo, determinar la ubicación pasta especificado por la aplicación receptora.

  • Generar o preparar los datos prometidos para la transferencia.

  • Si los datos se comprometió a no se puede almacenar como un archivo, añadir el sabor y los datos de la mesa de trabajo. De lo contrario, transferir los datos prometidos a la ubicación del archivo especificado.

Algún tiempo después, cuando la aplicación se cierra, o cuando ya no necesita la mesa de trabajo, la aplicación puede liberar la referencia mesa de trabajo.

Como en Windows, Silverlight API de portapapeles sólo utiliza kPasteboardClipboard y kUTTypeUTF16PlainText sabor a apoyar a copiar / pegar texto Unicode a / desde el portapapeles.

Realimentación

Estamos muy contentos de añadir soporte para portapapeles de Silverlight, y ver todos los escenarios importantes habilitados por esta API simple. Estoy interesado en escuchar sus reacciones, en particular:

  • las preocupaciones de seguridad sobre el diseño de Silverlight API de portapapeles y la aplicación
  • lo importante que es para añadir soporte para otro tipo de datos / formato, y en qué orden de prioridad
  • lo importante que es hacer extensible la API, como el apoyo a IDataObject , permitiendo formato personalizado / sabor y el retraso en la representación de datos / prometidos
    Gracias!
      -Ning
      Technorati Tags: ,
      Tags: , , Categorías: Silverlight Etiquetas: y ,
      1. Dileep
        02 de octubre 2011 a las 22:08 | # 1

        En el modo fuera de banda que puede acceder a la imagen del portapapeles, que fue el resultado de pulsar el botón de imprimir pantalla del Keyboard.Please hágamelo saber.

        -Dileep

      2. 10 de marzo 2011 a las 18:00 | # 2

        Me encantaría ser capaz de pegar datos de Excel. actualmente la forma en que funciona se tira a cualquier número que no aparece en Excel. ejemplo: $ 19.95 mostrando en Excel, pero los valores de la celda subyacente es realmente 19,949999999 Excel proporciona la visualización agradable sin perjudicar la exactitud de los datos subyacentes, pero eso es todo lo perdido con copiar y pegar en Silverlight ... que mis usuarios no están muy contentos. Sería bueno ser capaz de captar los datos en el formato Excel o por lo menos el excelente formato de datos XML, así que se podría manejar ese escenario cuando es necesario.

      3. Nick Gray
        27 de septiembre 2010 a las 18:50 | # 3

        Nuestra aplicación de negocios necesita el apoyo de pegar la imagen, por favor proporcione

      4. 19 de diciembre 2009 a las 11:08 | # 4

        @ Miguel
        Tomó nota, gracias por los comentarios!

      5. 19 de diciembre 2009 a las 11:08 | # 5

        @ Andrzej Rusztowicz
        Tomó nota, gracias por los comentarios!

      6. 29 de noviembre 2009 a las 16:53 | # 6

        Uno para el apoyo de la imagen

      7. 26 de noviembre 2009 a las 00:56 | # 7

        Apoyo Portapapeles de texto es un "must have" para Silverlight, pero el apoyo portapapeles _image_ podría ser de Silverlight "función única", y ayudar a los desarrolladores que eligen por encima de Air, Flash o Javascript.

        Simple copiado / pegado de capturas de pantalla, emoticonos, fotos iba a revolucionar muchos sitios web, como Flickr, MySpace, y los foros. Los desarrolladores que promueven la popularidad de Silverlight aunque sólo sea para usarlo de esta característica única, similar a usar el flash invisible para una sola "carga de varios archivos" característica.

        Como soporte de webcam, se añade en SL 4, este es el siguiente paso obvio (el usuario puede apuntar la cámara a la pantalla para "copiar / pegar" una captura de pantalla, pero esto es fácil de usar?)

      1. 26 de noviembre 2009 a las 01:23 | # 1
      2. 30 de diciembre 2009 a las 08:38 | # 2