Dela innehåll från din app – integrera Windows Share

Windows Share Sheet är ett systembaserat användargränssnitt som låter användare skicka innehåll från din app till andra Windows appar. Den här guiden förklarar hur du implementerar Share-kontraktet i paketerade appar (MSIX), Progressive Web Apps (PWA:er) och opaketerade Win32-appar.

I den här artikeln

Avsnitt Det här hittar du
Välj delningsmetod Välj rätt API-uppsättning för UWP-, skrivbords- eller PWA-appar
Implementera Dela för UWP-appar DataTransferManager.GetForCurrentView och ShowShareUI
Implementera delning för PWA:er Integrering av Web Share API
Implementera Share för skrivbordsappar IDataTransferManagerInteropdelning per fönster för WinUI 3, WPF, WinForms
Händelser på källsidan Observera målval, slutförande och annullering
Metodtips för Share Rekommendationer för tillförlitligt beteende på källsidan

Välj delningsmetod

Apptyp Metod API-uppsättning
UWP-appar Använda DataTransferManager.GetForCurrentView och ShowShareUI Windows.ApplicationModel.DataTransfer
Skrivbordsappar (WinUI 3, WPF, WinForms) Använd IDataTransferManagerInterop för delning per fönster (paketerat eller opaketerat) Windows Runtime via COM interop
Progressiva webbappar (PWA) Använd Web Share API + Windows-integrering W3C Web Share

Implementera delning för UWP-appar

Important

DataTransferManager.GetForCurrentView och ShowShareUI stöds endast i UWP-appar. Skrivbordsappar (WinUI 3, WPF eller WinForms - paketerade eller opaketerade) måste använda mönstret IDataTransferManagerInterop som visas i Implementera Dela för skrivbordsappar.

1. Hämta en DataTransferManager

I sidinitieringen hämtar du en referens till DataTransferManager:

using Windows.ApplicationModel.DataTransfer;

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

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

2. Fyll i ett DataPackage

När användaren initierar delning (till exempel klickar på knappen Dela) ska du skapa en DataPackage med innehållet och metadata:

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

När du delar en URL använder du SetWebLink (eller SetApplicationLink för djupa länkar) i stället SetTextför . Målappar kan sedan generera rika länkförhandsvisningar och hantera navigering korrekt, i stället för att behandla den som vanlig text.

3. Visa delningsgränssnittet

Öppna delningspanelen med ett knapptryck eller ett menykommando:

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();
}

Implementera delning för progressiva webbappar (PWA:er)

PWA:er använder W3C:s Web Share API. Kontrollera att PWA har de manifestegenskaper som krävs för att integrera med Windows:

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

I JavaScript-koden för din PWA använder du Web Share API:et:

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);
      }
    }
  }
}

Implementera Share för skrivbordsappar (WinUI 3, WPF, WinForms)

Skrivbordsappar – oavsett om de är paketerade eller opaketerade – använder IDataTransferManagerInterop-gränssnittet för att komma åt delningspanelen för varje fönster. Detta gäller för WinUI 3-, WPF- och WinForms-appar.

1. Deklarera interop-gränssnittet och skaffa en 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. Fyll i och visa

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);
}

Ett komplett exempel finns i WPF Share Source-exemplet.

Händelser på källsidan

Använd dessa händelser i källappar för att se vad som hände när användaren öppnar Dela.

API När det utlöses Varför du ska använda det
DataTransferManager.DataRequested Användaren startar en delningsåtgärd Skapa och bifoga DataPackage
DataTransferManager.TargetApplicationChosen Användaren väljer en målapp Valfri telemetri för målval
DataPackage.ShareCompleted Delningen är klar Valfri telemetri för lyckade händelser
DataPackage.ShareCanceled Användaren avbryter delningen Valfri telemetri för avbokning

Anmärkning

Det här exemplet används GetForCurrentView för korthet, vilket gäller för UWP-appar. I skrivbordsappar hämtar du DataTransferManager via IDataTransferManagerInterop.GetForWindow, som visats tidigare, och ansluter sedan samma händelser.

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");
}

Anmärkning

DataPackage.OperationCompleted och DataPackage.Destroyed är främst avsedda för arbetsflöden för Urklipp och inklistring. De behövs vanligtvis inte i Share source-scenarier.

Metodtips för Share

Använd den här checklistan för att hålla beteendet på källsidan förutsägbart.

Rekommenderad Undvik Varför det spelar roll
Använda SetWebLink eller SetApplicationLink för URL:er Använd SetText för URL:er Länkar återges korrekt och leder till rätt målapplikationer
Ange Title och valfria metadata (Description, miniatyrbild) Skicka innehåll utan metadata Förbättrar tydligheten i delningsgränssnittet och återgivningen av mål
Hantera TargetApplicationChosen, ShareCompletedoch ShareCanceled om du behöver telemetri Om vi antar att dessa signaler kommer från ShareOperation i källapparna Det här är signaler från källan för insikter efter delning
Håll delade nyttolaster fokuserade och giltiga för den valda åtgärden Skicka orelaterade eller överdimensionerade nyttolaster som standard Minskar antalet misslyckanden och förbättrar andelen lyckade delningar