目标和源App通过DataPackage传输数据:
public sealed class DataPackage {
public DataPackage(); // Constructs a new DataPackage object
// Use to set properties (ApplicationName, Title, Description, Thumbnail, etc.)
public DataPackagePropertySet Properties { get; }
// Optional: Use this to indicate why you're sharing the package (None, Copy, Move, Link)
public DataPackageOperation RequestedOperation { get; set; }
// Call SetData several times to add the same content in different formats
public void SetData(String formatId, Object value);
// These methods are simple, type-safe wrappers over SetData for common types:
public void SetText(String value);
public void SetRtf(String value);
public void SetHtmlFormat(String value); // See WinRT's HtmlFormatHelper class
public void SetBitmap(RandomAccessStreamReference value);
public void SetApplicationLink(Uri value);
public void SetWebLink(Uri value);
public void SetStorageItems(IEnumerable<IStorageItem> value);
public void SetStorageItems(IEnumerable<IStorageItem> value, Boolean readOnly);
// When adding HTML with references to content inaccessible to the target app,
// add each URI and RandomAccessStreamReference to the ResourceMap so the target app can
// access the content.
// Example: If HTML has <img src="ms-appx:///Images/Photo.jpg"/> do this:
// String imgSrc = "ms-appx:///Images/Photo.jpg";
// ResourceMap.Add(imgSrc, RandomAccessStreamReference.CreateFromUri(new Uri(imgSrc)));
public IDictionary<String, RandomAccessStreamReference> ResourceMap { get; }
// Optional: Raised after target app pastes data (source app can delete content if desired)
public event TypedEventHandler<DataPackage, OperationCompletedEventArgs> OperationCompleted;
// Optional: Raised after DataPackage is GC'd. This allows the source app
// to delete content (such as a temporary file) if desired:
public event TypedEventHandler<DataPackage, Object> Destroyed;
// Sets a delegate to handle requests from the target app
// (see "Delayed rendering of shared content")
public void SetDataProvider(String formatId, DataProviderHandler delayRenderer);
// Returns a read-only version of the DataPackage object (this is what target apps get)
public DataPackageView GetView();
}
支持的格式如下:
public static class StandardDataFormats {
public static String Text { get; } // "Text"
public static String Rtf { get; } // "Rich Text Format"
public static String Html { get; } // "HTML Format"
public static String Bitmap { get; } // "Bitmap"
public static String ApplicationLink { get; } // "ApplicationLink"
public static String WebLink { get; } // "UniformResourceLocatorW"
public static String StorageItems { get; } // "Shell IDList Array"
}
用户也可以自己定义数据格式,具体描述见http://schema.org 和https://github.com/AndreiMarukovich/Transhipment
还可以通过剪贴板共享:
// Static class since there is only one system clipboard
public static class Clipboard {
// Methods called by share source apps:
public static void Clear(); // Puts an empty DataPackage on the clipboard
public static void SetContent(DataPackage content); // Replaces any existing content
public static void Flush(); // Keeps content on clipboard even if app terminates
// Methods called by share target apps:
public static DataPackageView GetContent(); // Returns read-only view of DataPackage
// Raised when contents change (target apps use this to know if paste is possible)
public static event EventHandler<object> ContentChanged;
}
必须通过UI线程访问Clipboard:
private void PutDataPackageOnClipboard(DataPackageOperation operation) {
DataPackage dp = new DataPackage();
// Set desired properties:
dp.Properties.ApplicationName = Package.Current.DisplayName;
dp.Properties.Title = "DataPackage Title";
dp.Properties.Description = "DataPackage Description";
dp.RequestedOperation = operation; // None, Copy, Move, or Link
// Add desired data formats:
dp.SetText(m_txt.Text); // Pulling text from a TextBox control
// Optional: register event handlers:
dp.OperationCompleted += OnShareCompleted; // Mandatory for Move so source can delete data
dp.Destroyed += OnDataPackageDestroyed;
// Put DataPackage on clipboard. NOTE: The Clipboard makes a copy of the package;
// changes made to the DataPackage object do not impact what's already on the clipboard.
Clipboard.SetContent(dp);
}