Compartir
En este artículo se describe cómo puedes usar la interfaz IShare de .NET Multi-platform App UI (.NET MAUI). Esta interfaz proporciona una API para enviar datos, como texto o vínculos web, a la función de recurso compartido de dispositivos.
La implementación predeterminada de la interfaz IShare
está disponible a través de la propiedad Share.Default. Tanto la interfaz IShare
como la clase Share
están contenidas en el espacio de nombres Microsoft.Maui.ApplicationModel.DataTransfer
.
Cuando se realiza una solicitud de recurso compartido, el dispositivo muestra una ventana de recurso compartido, solicitando al usuario que elija una aplicación con la que compartir:
Introducción
Para acceder a la funcionalidad de Compartir, se requiere la siguiente configuración específica para la plataforma:
No es necesario realizar ninguna configuración.
Compartir texto y vínculos
La funcionalidad Compartir funciona mediante una llamada al método RequestAsync con una carga de datos que incluye información para compartir con otras aplicaciones. Se pueden combinar ShareTextRequest.Text y ShareTextRequest.Uri, y cada plataforma controlara el filtrado basado en el contenido.
public async Task ShareText(string text)
{
await Share.Default.RequestAsync(new ShareTextRequest
{
Text = text,
Title = "Share Text"
});
}
public async Task ShareUri(string uri, IShare share)
{
await share.RequestAsync(new ShareTextRequest
{
Uri = uri,
Title = "Share Web Link"
});
}
Compartir un archivo
También puedes compartir archivos con otras aplicaciones en el dispositivo. .NET MAUI detectará automáticamente el tipo de archivo (MIME) y solicitará el uso compartido. Pero, los sistemas operativos pueden restringir los tipos de archivos que se pueden compartir. Para compartir un único archivo, usa el tipo ShareFileRequest.
En el ejemplo de código siguiente se escribe un archivo de texto en el dispositivo y, después, se solicita compartirlo:
public async Task ShareFile()
{
string fn = "Attachment.txt";
string file = Path.Combine(FileSystem.CacheDirectory, fn);
File.WriteAllText(file, "Hello World");
await Share.Default.RequestAsync(new ShareFileRequest
{
Title = "Share text file",
File = new ShareFile(file)
});
}
Uso compartido de varios archivos
El uso compartido de varios archivos es ligeramente diferente del uso compartido de un solo archivo. Para compartir un único archivo, usa el tipo ShareMultipleFilesRequest.
En el ejemplo de código siguiente se escriben dos archivos de texto en el dispositivo y, después, se solicita compartirlos:
public async Task ShareMultipleFiles()
{
string file1 = Path.Combine(FileSystem.CacheDirectory, "Attachment1.txt");
string file2 = Path.Combine(FileSystem.CacheDirectory, "Attachment2.txt");
File.WriteAllText(file1, "Content 1");
File.WriteAllText(file2, "Content 2");
await Share.Default.RequestAsync(new ShareMultipleFilesRequest
{
Title = "Share multiple files",
Files = new List<ShareFile> { new ShareFile(file1), new ShareFile(file2) }
});
}
Ubicación de la presentación
Importante
Esta sección solo se aplica a iPadOS.
Al solicitar un recurso compartido o abrir el iniciador en iPadOS, tienes la posibilidad de presentar un elemento emergente. Esto especifica dónde aparecerá el elemento emergente y le apuntará directamente una flecha. Esta ubicación suele ser el control que inició la acción. Puede especificar la ubicación con la propiedad PresentationSourceBounds:
await Share.RequestAsync(new ShareFileRequest
{
Title = Title,
File = new ShareFile(file),
PresentationSourceBounds = DeviceInfo.Platform == DevicePlatform.iOS && DeviceInfo.Idiom == DeviceIdiom.Tablet
? new Rect(0, 20, 0, 0)
: Rect.Zero
});
await Launcher.OpenAsync(new OpenFileRequest
{
File = new ReadOnlyFile(file),
PresentationSourceBounds = DeviceInfo.Platform == DevicePlatform.iOS && DeviceInfo.Idiom == DeviceIdiom.Tablet
? new Rect(0, 20, 0, 0)
: Rect.Zero
});
Todo lo que se describe aquí funciona igual para Share y Launcher.
Este es un método de extensión que ayuda a calcular los límites de una vista:
public static class ViewHelpers
{
public static Rect GetAbsoluteBounds(this Microsoft.Maui.Controls.View element)
{
Element looper = element;
var absoluteX = element.X + element.Margin.Top;
var absoluteY = element.Y + element.Margin.Left;
// Add logic to handle titles, headers, or other non-view bars
while (looper.Parent != null)
{
looper = looper.Parent;
if (looper is Microsoft.Maui.Controls.View v)
{
absoluteX += v.X + v.Margin.Top;
absoluteY += v.Y + v.Margin.Left;
}
}
return new Rect(absoluteX, absoluteY, element.Width, element.Height);
}
}
Después, se puede usar al llamar a RequestAsync:
public Command<Microsoft.Maui.Controls.View> ShareCommand { get; } = new Command<Microsoft.Maui.Controls.View>(Share);
async void Share(Microsoft.Maui.Controls.View element)
{
try
{
await Share.Default.RequestAsync(new ShareTextRequest
{
PresentationSourceBounds = element.GetAbsoluteBounds(),
Title = "Title",
Text = "Text"
});
}
catch (Exception)
{
// Handle exception that share failed
}
}
Puede pasar el elemento que realiza la llamada cuando se desencadene Command
:
<Button Text="Share"
Command="{Binding ShareWithFriendsCommand}"
CommandParameter="{Binding Source={RelativeSource Self}}"/>
Para obtener un ejemplo de la clase ViewHelpers
, consulta el ejemplo de .NET MAUI hospedado en GitHub.
Diferencias entre plataformas
En esta sección se describen las diferencias específicas de la plataforma con la API de compartir.
- La propiedad ShareTextRequest.Subject se usa para el asunto deseado de un mensaje.