Tartalom megosztása az alkalmazásból – Windows megosztás integrálása

A Windows share sheet egy rendszer által biztosított felhasználói felület, amellyel a felhasználók tartalmat küldhetnek az alkalmazásból más Windows alkalmazásokba. Ez az útmutató bemutatja, hogyan valósíthatja meg a megosztási szerződést a csomagolt alkalmazások (MSIX), a progresszív Web Apps (PWA-k) és a csomagolatlan Win32-alkalmazások között.

Szakasz Mit fog találni?
A megosztási módszer kiválasztása Válassza ki a megfelelő API-készletet UWP-, asztali vagy PWA-alkalmazásokhoz
Megosztás implementálása UWP-alkalmazásokhoz DataTransferManager.GetForCurrentView és ShowShareUI
A megosztási funkció implementálása PWA-khoz Web Share API-integráció
Megosztás implementálása asztali alkalmazásokhoz IDataTransferManagerInteropAblakonkénti megosztás a WinUI 3, WPF, WinForms esetén
Forrásoldali események A cél kiválasztásának, befejezésének és lemondásának megfigyelése
Ajánlott eljárások a megosztáshoz Javaslatok a megbízható forrásoldali viselkedéshez

A megosztási módszer kiválasztása

Alkalmazás típusa Approach API-készlet
UWP-alkalmazások Használja DataTransferManager.GetForCurrentView és ShowShareUI Windows.ApplicationModel.DataTransfer
Asztali alkalmazások (WinUI 3, WPF, WinForms) Használat IDataTransferManagerInterop ablakonkénti megosztáshoz (csomagolt vagy csomagolatlan) Windows-futtatókörnyezet COM-együttműködésen keresztül
Progresszív webalkalmazások (PWA-k) A Web Share API + Windows integráció használata W3C webmegosztás

Megosztás implementálása UWP-alkalmazásokhoz

Important

DataTransferManager.GetForCurrentView és ShowShareUI csak UWP-alkalmazásokban támogatottak. Az asztali alkalmazásoknak (WinUI 3, WPF vagy WinForms – csomagolt vagy csomagolatlan) az IDataTransferManagerInteropasztali alkalmazásokhoz készült Megosztás implementálásában látható mintát kell használniuk.

1. DataTransferManager lekérése

Az oldal inicializálásakor szerezzen hivatkozást a(z) DataTransferManager elemre:

using Windows.ApplicationModel.DataTransfer;

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

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

2. DataPackage feltöltése

Amikor a felhasználó megosztást kezdeményez (például egy Megosztás gombra kattint), hozzon létre egy DataPackage tartalmat és metaadatokat:

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 */;
}

Tipp

Ha megoszt egy URL-címet, használja SetWebLink (vagy SetApplicationLink mélyhivatkozások) helyett SetText. A célalkalmazások ezután részletes hivatkozás-előnézeteket hozhatnak létre, és helyesen kezelhetik a navigációt, ahelyett, hogy egyszerű szövegként kezelnék.

3. A Megosztás felhasználói felületének megjelenítése

A Share Sheet aktiválása egy gombra kattintva vagy menüparancsból:

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

A „Share” funkció implementálása progresszív webalkalmazásokban

A PWA-k a W3C Web Share API-t használják. Győződjön meg arról, hogy a PWA rendelkezik az Windows integrálásához szükséges jegyzéktulajdonságokkal:

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

A PWA JavaScriptben használja a Webes megosztás API-t:

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

Megosztás implementálása asztali alkalmazásokhoz (WinUI 3, WPF, WinForms)

Az asztali alkalmazások – akár csomagolva, akár csomagolatlanul – a IDataTransferManagerInterop interfészt használják a Megosztás panel ablakonkénti eléréséhez. Ez a WinUI 3, WPF és WinForms-alkalmazásokra vonatkozik.

1. Deklarálja az interop interfészt, és szerezze be a DataTransferManagert

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. Feltöltés és megjelenítés

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

Egy teljes példáért tekintse meg a WPF forrásminta megosztását.

Forrásoldali események

A forrásalkalmazásokban ezeket az eseményeket használva megfigyelheti, hogy mi történt, miután a felhasználó megnyitja a Megosztást.

API Amikor kigyullad Mire használható
DataTransferManager.DataRequested A felhasználó elindít egy megosztási műveletet Hozza létre és csatolja a DataPackage
DataTransferManager.TargetApplicationChosen A felhasználó kiválaszt egy célalkalmazást Választható telemetriai adatok a cél kiválasztásához
DataPackage.ShareCompleted A megosztás befejeződött Választható sikertelemetria
DataPackage.ShareCanceled A felhasználó megszakítja a megosztást Választható lemondási telemetria

Note

Ez a példa a rövidség kedvéért a(z) GetForCurrentView elemet használja, amely az UWP-alkalmazásokra vonatkozik. Asztali alkalmazásokban szerezze be a DataTransferManager-t a IDataTransferManagerInterop.GetForWindow segítségével a korábban bemutatott módon, majd rendelje hozzá ugyanazokat az eseménykezelőket.

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 és DataPackage.Destroyed elsősorban vágólapra és munkafolyamatok beillesztésére használhatók. Ezekre általában nincs szükség a megosztási forrásforgatókönyvekhez.

Ajánlott eljárások a megosztáshoz

Ezzel az ellenőrzőlistát használva kiszámíthatóvá teszi a forrásoldali viselkedést.

Recommended Kerülje el Miért fontos?
URL-ekhez használja a(z) SetWebLink vagy SetApplicationLink elemet Használja a(z) SetText elemet URL-ekhez A hivatkozások megfelelően renderelnek és irányt mutatnak a célalkalmazásokban
Title és opcionális metaadatok beállítása (Description, bélyegkép) Tartalom küldése metaadatok nélkül Javítja a Megosztás felület áttekinthetőségét és a célok megjelenítését
Kezelje a(z) TargetApplicationChosen, ShareCompleted és ShareCanceled elemet, ha telemetriára van szüksége. Feltételezve, hogy ezek a jelek forrásalkalmazásokból származnak ShareOperation Ezek forrásoldali jelek a megosztás utáni megállapításokhoz
A megosztott adattartalmak legyenek a kiválasztott műveletre szabottak és érvényesek Alapértelmezés szerint nem releváns vagy túlméretezett adatteher küldése Csökkenti a hibákat, és javítja a megosztási siker arányát