Inhoud delen vanuit uw app - Windows Delen integreren

Het Windows Share Sheet is een door het systeem geleverde gebruikersinterface waarmee gebruikers inhoud van uw app kunnen verzenden naar andere Windows-apps. In deze handleiding wordt uitgelegd hoe u het Share-contract implementeert in verpakte apps (MSIX), Progressive Web Apps (PWA's) en uitgepakte Win32-apps.

In dit artikel

Afdeling Wat u zult vinden
Uw benadering voor delen kiezen De juiste API-set kiezen voor UWP-, desktop- of PWA-apps
Share implementeren voor UWP-apps DataTransferManager.GetForCurrentView en ShowShareUI
Share implementeren voor PWA's Web Share-API-integratie
Share implementeren voor bureaublad-apps IDataTransferManagerInterop delen per afzonderlijk venster voor WinUI 3, WPF, WinForms
Gebeurtenissen aan de bronzijde Doelselectie, voltooiing en annulering bekijken
Aanbevolen procedures voor delen Aanbevelingen voor betrouwbaar gedrag aan de bronzijde

Kies hoe u wilt delen

Type van de app Aanpak API set
UWP-apps Gebruiken DataTransferManager.GetForCurrentView en ShowShareUI Windows.ApplicationModel.DataTransfer
Bureaublad-apps (WinUI 3, WPF, WinForms) Gebruiken IDataTransferManagerInterop voor delen per venster (verpakt of uitgepakt) Windows Runtime via COM-interoperabiliteit
Progressive Web Apps (PWA) De webshare-API en Windows-integratie gebruiken W3C-webshare

Share implementeren voor UWP-apps

Important

DataTransferManager.GetForCurrentView en ShowShareUI worden alleen ondersteund in UWP-apps. Desktop-apps (WinUI 3, WPF of WinForms - verpakt of uitgepakt) moeten het IDataTransferManagerInterop patroon gebruiken dat wordt weergegeven in Share implementeren voor bureaublad-apps.

1. Haal een DataTransferManager op

Verkrijg in uw paginainitialisatie een verwijzing naar DataTransferManager:

using Windows.ApplicationModel.DataTransfer;

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();

        DataTransferManager dtm = DataTransferManager.GetForCurrentView();
        dtm.DataRequested += OnDataRequested;
    }
}

2. Een DataPackage vullen

Wanneer de gebruiker de share initieert (bijvoorbeeld op een knop Delen klikken), maakt u een DataPackage met de inhoud en metagegevens:

private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
    DataRequest request = args.Request;
    DataPackage data = request.Data;

    // Set a title (required)
    data.Properties.Title = "My shared content";

    // Set content - choose one or more:
    data.SetText("Here's some text to share");

    // For URLs, use SetWebLink to enable rich link previews:
    // data.SetWebLink(new Uri("https://example.com"));

    // For files or images:
    // IStorageItem item = await StorageFile.GetFileFromPathAsync(filePath);
    // data.SetStorageItems(new[] { item });

    // Optional: add description and thumbnail
    data.Properties.Description = "A brief description";
    // data.Properties.Thumbnail = /* RandomAccessStreamReference */;
}

Tip

Wanneer u een URL deelt, gebruikt u SetWebLink (of SetApplicationLink voor deeplinks) in plaats van SetText. Doel-apps kunnen vervolgens voorbeeldweergaven van rich link genereren en navigatie correct afhandelen in plaats van deze als tekst zonder opmaak te behandelen.

3. Toon de deelinterface

Open het deelvenster Delen via een klik op een knop of een menuopdracht:

private void ShareButton_Click(object sender, RoutedEventArgs e)
{
    // ShowShareUI is a static method on DataTransferManager.
    // The DataRequested handler was registered in step 1.
    DataTransferManager.ShowShareUI();
}

Share implementeren voor progressive Web Apps (PWA's)

PWA's maken gebruik van de W3C Web Share-API. Zorg ervoor dat uw PWA over de vereiste manifesteigenschappen beschikt om te integreren met Windows:

{
  "name": "My PWA",
  "short_name": "MyPWA",
  "share_target": {
    "action": "/share",
    "method": "POST",
    "enctype": "multipart/form-data",
    "params": {
      "files": [
        {
          "name": "media",
          "accept": ["image/*"]
        }
      ]
    }
  }
}

Gebruik in uw PWA JavaScript de Web Share-API:

async function shareContent() {
  if (navigator.share) {
    try {
      await navigator.share({
        title: 'Check this out',
        text: 'Great content',
        url: 'https://example.com/page'
      });
    } catch (err) {
      if (err.name !== 'AbortError') {
        console.error('Share failed:', err);
      }
    }
  }
}

Share implementeren voor bureaublad-apps (WinUI 3, WPF, WinForms)

Desktop-apps, ongeacht of deze zijn verpakt of uitgepakt, gebruiken de IDataTransferManagerInterop interface om per venster toegang te krijgen tot het Share-blad. Dit geldt voor WinUI 3-, WPF- en WinForms-apps.

1. Declareer de interop-interface en verkrijg een DataTransferManager

using Windows.ApplicationModel.DataTransfer;

[System.Runtime.InteropServices.ComImport]
[System.Runtime.InteropServices.Guid("3A3DCD6C-3EAB-43DC-BCDE-45671CE800C8")]
[System.Runtime.InteropServices.InterfaceType(
    System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIUnknown)]
interface IDataTransferManagerInterop
{
    IntPtr GetForWindow([System.Runtime.InteropServices.In] IntPtr appWindow,
        [System.Runtime.InteropServices.In] ref Guid riid);
    void ShowShareUIForWindow(IntPtr appWindow);
}

public sealed partial class MainWindow // WinUI 3 Window, WPF Window, or WinForms Form
{
    // IID of DataTransferManager, passed as the riid to GetForWindow:
    static readonly Guid _dtm_iid =
        new Guid(0xa5caee9b, 0x8708, 0x49d1, 0x8d, 0x36, 0x67, 0xd2, 0x5a, 0x8d, 0xa0, 0x0c);

    private DataTransferManager _dtm;

    // Call this from your window or form constructor (or load handler):
    private void InitializeShare()
    {
        // Retrieve the window handle (HWND) for the current window:
        //   WinUI 3:  IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
        //   WPF:      IntPtr hWnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
        //   WinForms: IntPtr hWnd = this.Handle;
        IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);

        IDataTransferManagerInterop interop =
            DataTransferManager.As<IDataTransferManagerInterop>();
        _dtm = WinRT.MarshalInterface<DataTransferManager>.FromAbi(
            interop.GetForWindow(hWnd, _dtm_iid));

        _dtm.DataRequested += (sender, args) => OnDataRequested(args);
    }
}

2. Vullen en weergeven

private void OnDataRequested(DataRequestedEventArgs args)
{
    DataRequest request = args.Request;
    DataPackage data = request.Data;

    data.Properties.Title = "Share from my desktop app";
    data.SetText("Shared content");

    // For URLs:
    // data.SetWebLink(new Uri("https://example.com"));

    // For files:
    // var item = await StorageFile.GetFileFromPathAsync(filePath);
    // data.SetStorageItems(new[] { item });
}

// In your Share button handler:
private void ShareButton_Click()
{
    var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
    var interop = DataTransferManager.As<IDataTransferManagerInterop>();
    interop.ShowShareUIForWindow(hWnd);
}

Zie het voorbeeld WPF Share Source voor een volledig voorbeeld.

Gebeurtenissen aan de bronzijde

Gebruik deze gebeurtenissen in bron-apps om te zien wat er is gebeurd nadat de gebruiker Share heeft geopend.

API Wanneer het brandt Redenen om dit te gebruiken
DataTransferManager.DataRequested De gebruiker start een deelactie Monteer en bevestig de DataPackage
DataTransferManager.TargetApplicationChosen De gebruiker kiest een doel-app Optionele telemetrie voor doelselectie
DataPackage.ShareCompleted Het delen is voltooid Optionele succestelemetrie
DataPackage.ShareCanceled De gebruiker annuleert de share Optionele telemetrie voor annulering

Note

In dit voorbeeld wordt GetForCurrentView gebruikgemaakt van beknoptheid, wat van toepassing is op UWP-apps. In desktoptoepassingen verkrijgt u de DataTransferManager tot en met IDataTransferManagerInterop.GetForWindow zoals eerder getoond, en koppelt u vervolgens dezelfde events.

private void RegisterShareEvents()
{
  var dtm = DataTransferManager.GetForCurrentView();
  dtm.DataRequested += OnDataRequested;
  dtm.TargetApplicationChosen += OnTargetChosen;
}

private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
  DataRequest request = args.Request;
  request.Data.Properties.Title = "Share from my app";
  request.Data.SetText("Hello from Windows Share");

  request.Data.ShareCompleted += OnShareCompleted;
  request.Data.ShareCanceled += OnShareCanceled;
}

private void OnTargetChosen(DataTransferManager sender, TargetApplicationChosenEventArgs args)
{
  // Optional: telemetry only
  Debug.WriteLine($"Target app: {args.ApplicationName}");
}

private void OnShareCompleted(DataPackage sender, ShareCompletedEventArgs args)
{
  Debug.WriteLine("Share completed");
}

private void OnShareCanceled(DataPackage sender, object args)
{
  Debug.WriteLine("Share canceled");
}

Note

DataPackage.OperationCompleted en DataPackage.Destroyed zijn voornamelijk bedoeld voor Klembord- en plakwerkstromen. Ze zijn over het algemeen niet nodig voor Share-bronscenario's.

Aanbevolen procedures voor delen

Gebruik deze controlelijst om het gedrag aan de bronzijde voorspelbaar te houden.

Aanbevolen Vermijd Waarom het belangrijk is
Gebruiken SetWebLink of SetApplicationLink voor URL's Gebruiken SetText voor URL's Links worden correct weergegeven en verwijzen correct door in doelapps
Stel Title en optionele metagegevens (Description, miniatuurafbeelding) Inhoud zonder metagegevens verzenden Verbetert de duidelijkheid van de Share-UI en de doelweergave
Verwerk TargetApplicationChosen, ShareCompleted en ShareCanceled als u telemetrie nodig hebt Ervan uitgaande dat deze signalen afkomstig zijn uit ShareOperation bron-apps Dit zijn bronsignalen voor inzicht na delen
Houd gedeelde payloads toegespitst op en geldig voor de geselecteerde actie Standaard niet-relevante of te grote payloads verzenden Vermindert mislukkingen en verbetert het slagingspercentage van delen