Archivieren

Posts Tagged 'Zwischenablage'

Silverlight-API-Zwischenablage

18. November 2009 7 Kommentare

Clipboard-API in Silverlight

Silverlight 4 fügt Unterstützung der Zwischenablage. Schauen Sie sich die erstaunlichen Demos von Scott Guthrie und Brian Goldfarb heute bei PDC , dass Schaufenster Szenarien durch Silveilght4 Zwischenablage-Unterstützung aktiviert.

Silverlight-Clipboard-API ist eine Teilmenge von WPF die Zwischenablage API:

  public static class Zwischenablage 
{
public static bool ContainsText ();
public static string gettext ();
text); public static void setText (String text);
}

Es ermöglicht Kopieren / Einfügen von Unicode-Zeichenfolgen nach / von System-Zwischenablage. GetText und SetText erfordern entweder zu folgen um erfolgreich zu sein:

  1. die Berufung Silverlight-Anwendung ist ein erhöhter vertrauenswürdige Anwendung, oder
  2. es wird Benutzer initiiert und Benutzer Zugriff auf die Zwischenablage Zuschüsse

Für den zweiten Fall, wenn GetText oder SetText erste befindet sich in einem Benutzer initiiert Ereignisbehandlung aufgerufen wird, erscheint ein Dialogfeld Silverlight wie das unten (UI kann bei RTW ändern):

    Clipboard Prompt
    Wenn Benutzer auf Ja klickt, wird Silverlight zulassen und später GetText / SetText Anrufe für diese Anwendung während dieser Sitzung erfolgreich sein, wenn kein Benutzer darauf klickt, dem Standardwert, wird eine Silverlight werfen SecurityException . Mit anderen Worten, ist die Einstellung pro Anwendung, pro Sitzung, für beide get-und set Zugriff auf System-Zwischenablage, und es wird nicht beibehalten.

Clipboard-API in JavaScript und WPF

Wir müssen viele Faktoren berücksichtigen bei der Gestaltung Clipboard-API für Silverlight. Unter ihnen sind die Clipboard-APIs von JavaScript und WPF besonders interessant, weil wir die Sicherheit Lektionen in JavaScript zu studieren und zu versuchen, die Kompatibilität mit WPF müssen.

Es gibt keine Cross-Browser-, Plattform-übergreifende JavaScript-API für Zugriff auf die Zwischenablage. IE bietet clipboardData Objekt, das get / set / löschen Zeichenketten in Zwischenablage des Systems erlaubt:

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

sData = window.clipboardData.getData (sDataFormat);

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

wo sDataFormat eine String-Konstante von "Text" oder "URL" ist, ist sData ein String, und bResult ist ein boolescher.

Das erste Mal, das clipboadData Objekt zugegriffen wird, wird IE Benutzer um Erlaubnis das Skript in die Zwischenablage zugreifen, und die Einstellung gilt nur für die Sitzung.

WPF-Clipboard-API unterstützt mehr und erweiterbare Daten-Format über IDataObject und hat Hilfsfunktionen für gängige Formate wie Text, Bild, Audio und FileDrop .

 public static class Zwischenablage 
{
[Sicherheitskritischen]
public static void Clear ();

public static bool ContainsAudio ();
format); public static bool ContainsData (String-Format);
public static bool ContainsFileDropList ();
public static bool ContainsImage ();
public static bool ContainsText ();
public static bool ContainsText (TextDataFormat Format);
public static Stream-GetAudioStream ();
format); öffentlichen statischen Objekt GetData (String-Format);
[Sicherheitskritischen]
public static IDataObject GetDataObject ();
public static StringCollection GetFileDropList ();
öffentlichen statischen BitmapSource GetImage ();
public static string gettext ();
public static string GetText (TextDataFormat Format);

public static bool IsCurrent (IDataObject Daten);

[] audioBytes); public static void SetAudio (byte [] audioBytes);
public static void SetAudio (Stream Audiostream);
format, object data); public static void SetData (String-Format-, Objekt-Daten);
[Sicherheitskritischen]
data); public static void SetDataObject (Objekt-Daten);
[Sicherheitskritischen]
data, bool copy); public static void SetDataObject (Objektdaten, bool Kopie);
public static void SetFileDropList (StringCollection fileDropList);
public static void SetImage (BitmapSource Bild);
text); public static void setText (String text);
text, TextDataFormat format); public static void setText (String text, TextDataFormat Format);
}

Clipboard-API in Windows und Mac OS X

. Silverlight-Zwischenablage API letztendlich wird oben auf die Zwischenablage APIs des zugrunde liegenden Betriebssystems implementiert Windows-Zwischenablage APIs werden in MSDN dokumentiert, gibt unten Auszug einen Überblick darüber, wie Sie / get Daten aus der Zwischenablage:

Ausschneiden und Kopieren

Um Informationen über die Zwischenablage zu platzieren, wird ein Fenster löscht zunächst alle vorherigen Inhalt der Zwischenablage mit der EmptyClipboard Funktion. Diese Funktion sendet die WM_DESTROYCLIPBOARD Nachricht an den früheren Besitzer Zwischenablage, gibt Ressourcen frei, mit Daten in der Zwischenablage verbunden sind, und ordnet Zwischenablage Eigentum an dem Fenster, das die Zwischenablage zu öffnen hat. Um herauszufinden, welche Fenster besitzt die Zwischenablage, rufen Sie die GetClipboardOwner Funktion.

Nach dem Entleeren der Zwischenablage, Platziert das Fenster Daten in der Zwischenablage in möglichst vielen Zwischenablage-Formate wie möglich, von den beschreibenden Format der Zwischenablage an die mindestens beschreibenden bestellt. Für jedes Format, ruft das Fenster die SetClipboardData Funktion, und geben Sie das Format-Kennung und ein globales Gedächtnis Griff. Der Speicher Griff kann NULL sein, was darauf hinweist, dass das Fenster die Daten auf Anfrage macht. Weitere Informationen finden Sie unter Verzögerte Rendering .

Paste Operations

Zum Einfügen von Informationen aus der Zwischenablage abzurufen, wird ein Fenster bestimmt zuerst die Clipboard-Format abrufen. In der Regel zählt ein Fenster die verfügbaren Formate der Zwischenablage mit der EnumClipboardFormats Funktion und nutzt die erste Format er erkennt. Diese Methode wählt den besten verfügbaren Format entsprechend der Priorität gesetzt, wenn die Daten in die Zwischenablage gelegt wurde.

Alternativ kann auch ein Fenster mit dem GetPriorityClipboardFormat Funktion. Diese Funktion identifiziert die besten verfügbaren Format der Zwischenablage nach einem festgelegten Priorität. Ein Fenster, das nur ein Clipboard-Format erkennt, können Sie einfach feststellen, ob das Format verfügbar ist, indem Sie die IsClipboardFormatAvailable Funktion.

Nach der Bestimmung des Clipboard-Format zu verwenden, ruft ein Fenster, das GetClipboardData Funktion. Diese Funktion gibt das Handle zu einem globalen Speicher-Objekt mit Daten im angegebenen Format. Ein Fenster kann kurzzeitig sperren Sie die Speicher-Objekt, um zu prüfen oder kopieren Sie die Daten. Allerdings sollte ein Fenster nicht befreien Sie das Objekt oder lassen Sie es für einen langen Zeitraum gesperrt.

Denn jetzt, Silverlight Clipboard-API unterstützt nur CF_UNICODETEXT Format für Copy / Paste Unicode-Text an / aus der Zwischenablage.

Mac OS X verwendet Pappe-Manager . Es wird dokumentiert unter Mac Dev Center . Nachfolgend Auszug (mit zusätzlichen APIs) gibt einen Überblick:

Die Vervielfältigung Anwendung ist verantwortlich für die Platzierung kopiert oder ausgeschnitten Daten auf die Pappe:

  1. Der Benutzer wählt ein paar Daten und ruft die Kopieren (oder Ausschneiden) Menüpunkt.

  2. Wenn die Anwendung nicht bereits über einen Verweis auf die Zwischenablage Pappe, erstellt es eine ( PasteboardCreate ).

  3. Die Anwendung erfolgt dann das Eigentum an der Pappe und löscht den aktuellen Inhalt ( PasteboardClear ).

  4. Die Anwendung weist Element-IDs, um die ausgewählten Daten.

  5. Wenn Daten an versprochen werden, muss der Antrag auf Eintragung eines Promise Keeper Callback-Funktion, um die versprochenen Daten (beliefern PasteboardSetPromiseKeeper ).

  6. Die Anwendung fügt eine oder mehrere Aromen der einzelnen Elemente in die Zwischenablage, einschließlich entweder in tatsächlichen Geschmack Daten oder eines Versprechens mit jeder Geschmacksrichtung ( PasteboardPutItemFlavor ).

Die empfangende Anwendung hat eine etwas andere Gruppe von Aufgaben, um die Paste Aktion zu behandeln:

  1. Wenn die Anwendung aktiv wird, prüft es, ob die Pappe so modifiziert wurde ( PasteboardSynchronize ). Wenn ja, erhält er eine Auflistung der Aromen auf der Montagefläche. Wenn es irgendwelche Aromen von der Anwendung unterstützt werden, kann es ermöglichen den Pasten-Menüpunkt.

  2. Der Benutzer ruft den Menüpunkt Einfügen.

  3. Die Anwendung Zugriff auf das Element (oder Elemente) auf der Montagefläche in den Geschmacksrichtungen, die es unterstützt

  4. Wenn die eingefügten Daten ist als Datei gespeichert werden, muss die empfangende Anwendung zu einer Paste Lage vor der Anforderung keine Aroma-Daten gesetzt. In jedem anderen Fall wird die empfangende Anwendung nicht um, ob die Paste Daten versprochen wurde oder sich keine Sorgen.

Falls das Kopieren Anwendung Promise Keeper aufgerufen wird, muss die Callback wie folgt vor:

  • Wenn die Daten als Datei gespeichert werden sollen, bestimmen die Paste Befestigung durch die empfangende Anwendung angegeben.

  • Generieren oder anderweitig vorbereiten, die versprochenen Daten für die Übertragung.

  • Wenn die Daten versprochen wird nicht als Datei gespeichert werden, fügen Sie den Geschmack und die Daten in die Zwischenablage. Sonst übertragen die versprochenen Daten in die angegebene Datei an.

Einige Zeit später, wenn die Anwendung, beendet oder wenn es nicht mehr braucht die Pappe, kann die Anwendung lassen Sie die Pappe auf.

Wie unter Windows, Silverlight Clipboard-API verwendet nur kPasteboardClipboard und kUTTypeUTF16PlainText Geschmack zu unterstützen Kopie / Paste Unicode-Text zu / aus der Zwischenablage.

Rückkopplung

Wir freuen uns auf die Unterstützung der Zwischenablage, um Silverlight hinzuzufügen, und schauen Sie sich alle wichtigen Szenarien durch diese einfache API aktiviert. Ich bin interessiert an Ihrer Rückmeldungen, vor allem:

  • etwaige Sicherheitsbedenken in Bezug auf Silverlight Zwischenablage API Design und Implementierung
  • wie wichtig es ist, die Unterstützung für andere Datentypen / Format hinzuzufügen ist, und in welcher Rangfolge
  • wie wichtig es ist, um die API erweiterbar zu machen, wie die Unterstützung IDataObject , so dass benutzerdefinierte Format / Geschmack und verzögerte Rendering / versprochenen Daten
    Vielen Dank!
      -Ning
      Technorati Tags: ,