Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il foglio di condivisione Windows è un'interfaccia utente fornita dal sistema che consente agli utenti di inviare contenuto dall'app ad altre app Windows. Questa guida illustra come implementare il contratto di condivisione tra app in pacchetto (MSIX), progressive App Web (PWA) e app Win32 senza pacchetti.
In questo articolo
| Sezione | Cosa troverai |
|---|---|
| Scegliere l'approccio di condivisione | Selezionare il set di API corretto per le app UWP, desktop o PWA |
| Implementa la condivisione per le app UWP |
DataTransferManager.GetForCurrentView e ShowShareUI |
| Implementa la condivisione per PWA | Integrazione dell'API Di condivisione Web |
| Implementare la condivisione nelle applicazioni desktop |
IDataTransferManagerInteropCondivisione per finestra per WinUI 3, macchine virtuali Windows, WinForms |
| Eventi lato sorgente | Osserva la selezione, il completamento e l'annullamento dell'obiettivo |
| Procedure consigliate per la condivisione | Raccomandazioni per un comportamento affidabile sul lato origine |
Scegliere l'approccio di condivisione
| Tipo di app | Avvicinarsi | Set di API |
|---|---|---|
| App UWP | Usare DataTransferManager.GetForCurrentView ed ShowShareUI |
Windows.ApplicationModel.DataTransfer |
| Applicazioni desktop (WinUI 3, macchine virtuali Windows, WinForms) | Usare IDataTransferManagerInterop per la condivisione per finestra (in pacchetto o senza pacchetto) |
Windows Runtime con interoperabilità COM |
| App Web Progressive (PWA) | Usare l'API di condivisione Web e l'integrazione di Windows | W3C Web Share |
Implementare la condivisione per le app UWP
Importante
DataTransferManager.GetForCurrentView e ShowShareUI sono supportati solo nelle app UWP. Le applicazioni desktop (WinUI 3, macchine virtuali Windows o WinForms, con o senza pacchetto) devono usare il modello IDataTransferManagerInterop illustrato in Implementare la condivisione per le applicazioni desktop.
1. Ottenere un DataTransferManager
Durante l'inizializzazione della pagina, ottieni un riferimento a DataTransferManager:
using Windows.ApplicationModel.DataTransfer;
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
DataTransferManager dtm = DataTransferManager.GetForCurrentView();
dtm.DataRequested += OnDataRequested;
}
}
2. Popolare un pacchetto di dati
Quando l'utente avvia la condivisione (ad esempio, fa clic su un pulsante Condividi), crea un DataPackage oggetto con il contenuto e i metadati:
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
Quando si condivide un URL, usare SetWebLink (o SetApplicationLink per i collegamenti diretti) anziché SetText. Le app di destinazione possono quindi generare anteprime avanzate dei link e gestire correttamente la navigazione, invece di trattarli come semplice testo.
3. Mostra l'interfaccia utente di condivisione
Attivare il foglio di condivisione da un pulsante o un comando di menu:
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();
}
Implementare la condivisione per i App Web progressivi (PWA)
Le app PWA usano l'API Web Share del W3C. Assicurarsi che la PWA disponga delle proprietà richieste del manifest per integrarsi con Windows:
{
"name": "My PWA",
"short_name": "MyPWA",
"share_target": {
"action": "/share",
"method": "POST",
"enctype": "multipart/form-data",
"params": {
"files": [
{
"name": "media",
"accept": ["image/*"]
}
]
}
}
}
Nel codice JavaScript della tua PWA, usa l'API Web Share:
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);
}
}
}
}
Implementa la condivisione per le app desktop (WinUI 3, macchine virtuali Windows, WinForms)
Le app desktop, sia in pacchetto che non in pacchetto, usano l'interfaccia IDataTransferManagerInterop per accedere al foglio di condivisione in base a ogni finestra. Questo vale per le app WinUI 3, macchine virtuali Windows e WinForms.
1. Dichiarare l'interfaccia di interoperabilità e ottenere un 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. Compilare e mostrare
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);
}
Per un esempio completo, consulta il sample macchine virtuali Windows Share Source.
Eventi lato origine
Usare questi eventi nelle app di origine per osservare cosa è successo dopo l'apertura della condivisione da parte dell'utente.
| API | Quando viene attivato | Perché usarlo |
|---|---|---|
DataTransferManager.DataRequested |
L'utente avvia un'operazione di condivisione | Compilare e collegare DataPackage |
DataTransferManager.TargetApplicationChosen |
L'utente sceglie un'app di destinazione | Telemetria facoltativa per la selezione della destinazione |
DataPackage.ShareCompleted |
La condivisione è completata | Telemetria di esito positivo facoltativo |
DataPackage.ShareCanceled |
L'utente annulla la condivisione | Telemetria di annullamento facoltativa |
Annotazioni
Questo esempio usa GetForCurrentView per brevità, che si applica alle app UWP. Nelle app desktop acquisire il DataTransferManager tramite IDataTransferManagerInterop.GetForWindow come illustrato in precedenza, quindi allegare gli stessi eventi.
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");
}
Annotazioni
DataPackage.OperationCompleted e DataPackage.Destroyed sono usati principalmente per gli Appunti e per i flussi di lavoro di incolla. In genere non sono necessari per gli scenari di origine di Share.
Procedure consigliate per la condivisione
Usare questo elenco di controllo per mantenere prevedibile il comportamento sul lato origine.
| Raccomandato | Evitare | Perché è importante |
|---|---|---|
Usare SetWebLink o SetApplicationLink per gli URL |
Usare SetText per gli URL |
I collegamenti vengono visualizzati e indirizzano correttamente nelle app di destinazione |
Impostare Title e i metadati opzionali (Description, miniatura) |
Invio di contenuto senza metadati | Migliora la chiarezza e il rendering della destinazione dell'interfaccia utente di condivisione |
Gestire TargetApplicationChosen, ShareCompletede ShareCanceled se sono necessari dati di telemetria |
Supponendo che questi segnali provengano da ShareOperation nelle app di origine |
Questi sono segnali lato origine per l'analisi successiva alla condivisione |
| Mantenere concentrati i payload condivisi e validi per l'azione selezionata | Invio di payload non correlati o sovradimensionati per impostazione predefinita | Riduce i fallimenti e migliora il tasso di successo della condivisione |