2015-08-03 11 views
7

Ich schreibe eine C# Windows Universal App, wo der Benutzer eine Datei in die Zwischenablage kopieren kann. Aber wenn die App geschlossen ist, geht der Inhalt der Zwischenablage verloren. Die Benutzerfreundlichkeit ist schrecklich, wenn der Benutzer seinen Inhalt in der Zwischenablage so leicht verlieren kann. Gibt es eine Möglichkeit, den Inhalt der Zwischenablage in der App wie in jeder anderen klassischen Windows-Anwendung persistent zu machen?Zwischenablage Inhalt der geschlossenen Windows Universal App

Beispielcode:

public static void CopyFileToClipboard(StorageFile file) { 
    DataPackage dp = new DataPackage(); 
    dp.RequestedOperation = DataPackageOperation.Copy; 
    dp.SetStorageItems(new List<StorageFile>() { file }); 
    Clipboard.SetContent(dp); // not available after app closed 
    Clipboard.Flush(); 
} 

public static void CopyTextToClipboard(string text) { 
    DataPackage dp = new DataPackage(); 
    dp.RequestedOperation = DataPackageOperation.Copy; 
    dp.SetText(text); // available after app closed 
    Clipboard.SetContent(dp); 
    Clipboard.Flush(); 
} 

//I have tried to copy the file to the app folder first but it has nothing changed. 
public async static void CacheAndCopyFileToClipboard(StorageFile file) { 
    DataPackage dp = new DataPackage(); 
    dp.RequestedOperation = DataPackageOperation.Copy; 
    var xfile = await ApplicationData.Current.LocalFolder.CreateFileAsync(file.Name); 
    await file.CopyAndReplaceAsync(xfile); 
    dp.SetStorageItems(new List<StorageFile>() { xfile }); 
    Clipboard.SetContent(dp); // not available after app closed 
    Clipboard.Flush(); 
} 

Die Frage ist also, wie kann ich eine Datei setzen zu kopieren, so dass Benutzer sie auch einfügen können, wenn die App geschlossen ist?

Bearbeiten: Es scheint, dass ein Problem aller Windows Universal Apps ist, wenn Sie beispielsweise ein Bild in die Windows Photo App kopieren, können Sie es nur einfügen, während die Photo App läuft. Ich kann mir nicht vorstellen, dass dieses seltsame Verhalten das Standardverhalten von Apps sein sollte. Es sieht eher wie ein Fehler aus, weil ich keinen Grund für dieses seltsame Verhalten sehe.

Edit2: Neues Beispiel des Problems (Danke an Joe300 für sein Feedback). Es funktioniert mit Zeichenfolgen, aber nicht mit einer StorageFile (selbst wenn es zuerst in den lokalen App-Ordner kopiert wird). Was ist der Grund, dass der Befehl Flush() nicht mit Dateien funktioniert? Ist da etwas besonderes zu beachten wenn Dateien benutzt werden (Berechtigungen, ...)?

Antwort

2

Sie müssen einen Anruf zu Flush hinzufügen, damit der Inhalt verfügbar ist, nachdem die App heruntergefahren wurde.

Fügt den Inhalt der Zwischenablage hinzu und gibt das DataPackage-Objekt aus der Quellanwendung frei. Mit dieser Methode bleibt der Inhalt verfügbar, nachdem die Anwendung heruntergefahren wurde.

Sie sollten auch stellen Sie die RequestedOperation:

dp.RequestedOperation = DataPackageOperation.Copy; 
try 
{ 
    Windows.ApplicationModel.DataTransfer.Clipboard.SetContent(dp); 
    Clipboard.Flush(); 
} 
catch (Exception ex) 
{ 
    // Copying data to Clipboard can potentially fail - for example, if another application is holding Clipboard open     
} 

Darüber hinaus, gibt es wirklich keine anderen Optionen für die Clipboard manipulieren.

+0

Es hat das Problem nicht gelöst, wenn ich die App schließe, die Datei ist verloren. Call Clipboard.Flush() änderte das nicht, obwohl die Beschreibung dieses Befehls so aussieht, als wäre dies die Lösung. Vielleicht ist dies ein Problem mit StorageFile-Objekten, weil es so aussieht, als würde es mit Strings arbeiten. – ctron

+0

Wie initialisierst du das 'StorageFile'? – WiredPrairie

+0

dp.Flush(); existiert auf dem DataPackage nur in der Zwischenablage nicht. Das StorageFile und das SetContent sollten nicht das Problem sein, da alles einwandfrei funktioniert, während die App ausgeführt wird, aber wenn die App geschlossen wird, verlor die Zwischenablage den Inhalt. Die Flush- und DataPackageOperation.Copy-Erweiterungen meines ursprünglichen Codes lösen dieses Problem nicht ... – ctron