Udostępnianie zawartości z aplikacji Windows

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