Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Kontrakt Windows Sdílet umožňuje uživatelům rychle sdílet obsah ( například text, odkazy, fotky a videa) z vaší aplikace do jiných aplikací. Uživatel může například chtít sdílet webovou stránku se svými přáteli pomocí aplikace pro sociální sítě nebo uložit odkaz do aplikace poznámek, na které se chcete podívat později.
Tento článek vysvětluje, jak implementovat stranu zdroje kontraktu Share: kód, který připravuje obsah a otevírá panel Sdílení systému Windows ve vaší aplikaci. Informace o příjmu sdíleného obsahu najdete v tématu Příjem sdílených dat v aplikaci Windows.
Rozhraní API Windows.ApplicationModel.DataTransfer použitá v tomto článku fungují u aplikací, které mají identitu balíčku, včetně aplikací UWP a desktopových aplikací WinUI 3 v balíčku. Rozbalené aplikace Win32 se mohou účastnit udělením identity balíčku a následným použitím IDataTransferManagerInterop.
Note
Desktopové aplikace WinUI 3 nemají k dispozici CoreWindow, takže nemůžete přímo volat DataTransferManager.GetForCurrentView() ani DataTransferManager.ShowShareUI(). Místo toho použijte rozhraní COM interop IDataTransferManagerInterop k přidružení DataTransferManager k popisovači vašeho okna a k zobrazení uživatelského rozhraní pro sdílení. Příklady kódu najdete v tématu Zobrazení objektů uživatelského rozhraní WinRT, které závisí na CoreWindow. Úplnou implementaci najdete také v ukázce zdrojové aplikace obsahu pro sdílení ve WPF (Windows Presentation Foundation).
Nastavte obslužnou rutinu události
Zaregistrujte obslužnou rutinu události DataRequested ve vaší DataTransferManager instanci. Tato událost se aktivuje, když uživatel vyvolá sdílení – například když v aplikaci klepne na tlačítko Sdílet nebo když aplikace zjistí, že je obsah připravený ke sdílení.
Pro desktopové aplikace WinUI 3 získejte pro své okno DataTransferManager pomocí IDataTransferManagerInterop, jak je popsáno v Zobrazení objektů uživatelského rozhraní WinRT závislých na CoreWindow.
Zadání obsahu v obslužné rutině DataRequested
Když dojde k události DataRequested , vaše aplikace obdrží objekt DataRequest obsahující DataPackage , který naplníte obsahem ke sdílení. Musíte nastavit název a alespoň jeden datový formát. Popis je volitelný, ale doporučuje se.
private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
DataRequest request = args.Request;
request.Data.Properties.Title = "Contoso article";
request.Data.Properties.Description = "An interesting article from Contoso.";
request.Data.SetText("Read this article at Contoso.com.");
request.Data.SetWebLink(new Uri("https://contoso.com/articles/1234"));
}
Warning
Vlastnost Title je povinná. Pokud název nenastavíte, operace sdílení selže.
Volba datových formátů
DataPackage podporuje více předdefinovaných datových formátů. Do stejného balíčku můžete zadat více formátů – přijímající aplikace používá jakýkoli formát, který nejlépe podporuje.
| Formát | Metoda |
|---|---|
| Prostý text | SetText |
| Webové odkazy | SetWebLink |
| Odkazy na aplikace | SetApplicationLink |
| jazyk HTML | SetHtmlFormat |
| Formát RTF | SetRtf |
| Rastrové obrázky | SetBitmap |
| Soubory a složky | SetStorageItems |
| Vlastní data definovaná vývojářem | SetData |
Nastavení vlastností
DataPackagePropertySet umožňuje připojit ke sdílenému obsahu další metadata. Přidání miniatury dává sdílenému listu širší vizuální náhled. Další informace naleznete v tématu DataPackagePropertySet.
private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
DataRequest request = args.Request; // The DataRequested event provides the request via args.Request.
request.Data.Properties.Title = "Sunset photo";
request.Data.Properties.Description = "Taken at Lake Tahoe.";
// Providing a thumbnail is optional but improves the share sheet preview.
// request.Data.Properties.Thumbnail = RandomAccessStreamReference.CreateFromFile(thumbnailFile);
}
Spuštění uživatelského rozhraní pro sdílení
Po registraci události DataRequested otevřete panel Sdílení systému Windows, když uživatel vyvolá příkaz Sdílet. V případě desktopových aplikací WinUI 3 zavolejte ShowShareUIForWindow na rozhraní IDataTransferManagerInterop a předejte identifikátor HWND vašeho okna. Příklady kódu najdete v tématu Zobrazení objektů uživatelského rozhraní WinRT, které závisí na CoreWindow.
Řešte chyby
Pokud vaše aplikace nemůže poskytnout obsah ke sdílení – například proto, že uživatel nic nevybral – zavolejte FailWithDisplayText, aby se v uživatelském rozhraní pro sdílení zobrazila informativní zpráva:
private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
if (string.IsNullOrEmpty(selectedText))
{
args.Request.FailWithDisplayText("Select some text in the app before sharing.");
return;
}
args.Request.Data.Properties.Title = "Selected text";
args.Request.Data.SetText(selectedText);
}
Zpoždění sdílení s delegáty
Pokud je generování dat pro sdílení náročné na prostředky – například při kódování velkého obrázku v několika rozlišeních – použijte delegáta, aby se data vytvořila jen tehdy, když si je přijímající aplikace vyžádá. Vyhnete se tak zbytečné práci, pokud uživatel ještě nevybral cíl.
private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
args.Request.Data.Properties.Title = "High-res photo";
args.Request.Data.SetDataProvider(StandardDataFormats.Bitmap, OnDeferredImageRequested);
}
// Note: DataProviderHandler requires async void. The try/finally ensures the
// deferral completes even if an exception occurs.
private async void OnDeferredImageRequested(DataProviderRequest request)
{
DataProviderDeferral deferral = request.GetDeferral();
try
{
if (this.imageStream == null)
{
return;
}
InMemoryRandomAccessStream inMemoryStream = new InMemoryRandomAccessStream();
// Decode the source image and re-encode at 50% size.
BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(this.imageStream);
BitmapEncoder imageEncoder = await BitmapEncoder.CreateForTranscodingAsync(
inMemoryStream, imageDecoder);
imageEncoder.BitmapTransform.ScaledWidth =
(uint)(imageDecoder.OrientedPixelWidth * 0.5);
imageEncoder.BitmapTransform.ScaledHeight =
(uint)(imageDecoder.OrientedPixelHeight * 0.5);
await imageEncoder.FlushAsync();
request.SetData(RandomAccessStreamReference.CreateFromStream(inMemoryStream));
}
finally
{
deferral.Complete();
}
}
Viz také
- Příjem sdílených dat v aplikaci Windows
- Sdílení zabalených aplikací pomocí Windows Share
- Integrace rozbalených aplikací se službou Windows Share
- Zobrazení objektů uživatelského rozhraní WinRT závislých na CoreWindow
- IDataTransferManagerInterop
- DataTransferManager
- DataPackage
- DataRequest
- FailWithDisplayText
- Ukázka aplikace WPF (Windows Presentation Foundation) pro zdroj obsahu sdílení
Windows developer