Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Kontrakt Windows Share umożliwia użytkownikom szybkie udostępnianie zawartości , takiej jak tekst, linki, zdjęcia i filmy wideo — z aplikacji do innych aplikacji. Na przykład użytkownik może chcieć udostępnić stronę internetową znajomym przy użyciu aplikacji sieci społecznościowej lub zapisać link w aplikacji notatek, aby odwoływać się później.
W tym artykule wyjaśniono, jak zaimplementować stronę źródłową kontraktu udostępniania: kod, który przygotowuje zawartość i otwiera arkusz udostępniania systemu Windows w aplikacji. Aby uzyskać informacje na temat odbierania zawartości udostępnionej, zobacz Odbieranie udostępnionych danych w aplikacji Windows.
Interfejsy API Windows.ApplicationModel.DataTransfer używane w tym artykule działają w przypadku aplikacji, które mają identyfikator pakietu, w tym aplikacji UWP i pakietowanych aplikacji klasycznych WinUI 3. Aplikacje Win32 bez pakietu mogą w tym uczestniczyć, nadając im tożsamość pakietu, a następnie używając IDataTransferManagerInterop.
Note
Aplikacje klasyczne WinUI 3 nie mają elementu CoreWindow, więc nie można wywoływać DataTransferManager.GetForCurrentView() ani DataTransferManager.ShowShareUI() bezpośrednio. Zamiast tego użyj interfejsu COM współdziałania IDataTransferManagerInterop, aby skojarzyć element DataTransferManager z uchwytem okna i wyświetlić interfejs użytkownika udostępniania. Przykłady kodu można znaleźć w temacie Wyświetlanie obiektów interfejsu użytkownika WinRT, które są zależne od systemu CoreWindow. Możesz też zapoznać się z przykładem aplikacji źródła zawartości udostępniania w WPF, aby zobaczyć kompletną implementację.
Konfigurowanie programu obsługi zdarzeń
Zarejestruj obsługę zdarzenia DataRequested dla swojego wystąpienia DataTransferManager. To zdarzenie jest uruchamiane, gdy użytkownik wywołuje pozycję Udostępnij — na przykład po naciśnięciu przycisku Udostępnij w aplikacji lub określeniu, że zawartość jest gotowa do udostępnienia.
W przypadku aplikacji klasycznych WinUI 3 uzyskaj dla swojego okna obiekt DataTransferManager za pomocą IDataTransferManagerInterop, zgodnie z opisem w artykule Wyświetlanie obiektów interfejsu użytkownika WinRT zależnych od CoreWindow.
Udostępnij zawartość w programie obsługi DataRequested
Gdy wystąpi zdarzenie DataRequested , aplikacja odbiera obiekt DataRequest zawierający pakiet DataPackage wypełniony zawartością do udostępnienia. Musisz ustawić tytuł i co najmniej jeden format danych. Opis jest opcjonalny, ale zalecany.
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"));
}
Ostrzeżenie
Właściwość Title jest wymagana. Jeśli nie ustawisz tytułu, operacja udostępniania zakończy się niepowodzeniem.
Wybieranie formatów danych
Pakiet DataPackage obsługuje wiele wbudowanych formatów danych. W tym samym pakiecie można udostępnić więcej niż jeden format — aplikacja odbierająca użyje formatu, który obsługuje najlepiej.
| Forma | Metoda |
|---|---|
| Zwykły tekst | SetText |
| Linki internetowe | SetWebLink |
| Linki aplikacji | SetApplicationLink |
| HTML | SetHtmlFormat |
| Tekst sformatowany (RTF) | SetRtf |
| Bitmapowe obrazy | SetBitmap |
| Pliki i foldery | SetStorageItems |
| Niestandardowe dane zdefiniowane przez dewelopera | SetData |
Określ właściwości
Zestaw DataPackagePropertySet umożliwia dołączenie dodatkowych metadanych do udostępnionej zawartości. Dodanie miniatury zapewnia w arkuszu udostępniania bardziej rozbudowany podgląd wizualny. Aby uzyskać więcej informacji, zobacz 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);
}
Uruchom interfejs udostępniania
Po zarejestrowaniu obsługi zdarzenia DataRequested otwórz arkusz udostępniania systemu Windows, gdy użytkownik wywoła funkcję Udostępnij. W przypadku aplikacji klasycznych WinUI 3 wywołaj ShowShareUIForWindow w interfejsie IDataTransferManagerInterop, przekazując HWND swojego okna. Przykłady kodu można znaleźć w temacie Wyświetlanie obiektów interfejsu użytkownika WinRT, które są zależne od systemu CoreWindow.
Zarządzanie błędami
Jeśli aplikacja nie może udostępnić treści do udostępnienia — na przykład dlatego, że użytkownik nie wybrał niczego — wywołaj metodę FailWithDisplayText, aby wyświetlić informacyjny komunikat w interfejsie użytkownika udostępniania:
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);
}
Opóźnij udostępnianie delegatom
Jeśli przygotowanie danych do udostępnienia jest zasobochłonne — na przykład kodowanie dużego obrazu w wielu rozdzielczościach — użyj obiektu delegata, aby dane były generowane tylko wtedy, gdy aplikacja odbierająca ich zażąda. Pozwala to uniknąć niepotrzebnej pracy, gdy użytkownik nie wybrał jeszcze elementu docelowego.
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();
}
}
Zobacz także
- Odbieranie udostępnionych danych w aplikacji Windows
- Zintegruj pakietowe aplikacje z Windows Share
- Integracja nierozpakowanych aplikacji z Windows Share
- Wyświetlanie obiektów interfejsu użytkownika winRT, które zależą od coreWindow
- IDataTransferManagerInterop
- DataTransferManager
- DataPackage
- DataRequest
- FailWithDisplayText
- Przykład aplikacji źródłowej udostępniania zawartości WPF