Прочитать на английском

Поделиться через


Общий доступ

Browse sample. Обзор примера

В этой статье описывается, как использовать интерфейс многоплатформенного приложения .NET (.NET MAUI). IShare Этот интерфейс предоставляет API для отправки данных, таких как текстовые или веб-ссылки, в функцию общего доступа устройств.

Реализация интерфейса по умолчанию IShare доступна через Share.Default свойство. Интерфейс IShare и Share класс содержатся в Microsoft.Maui.ApplicationModel.DataTransfer пространстве имен.

При выполнении запроса на общий доступ устройство отображает окно общего доступа, предлагая пользователю выбрать приложение для общего доступа:

Share from your app to a different app

Начать

Для доступа к функциональным возможностям Общего доступа требуется следующая настройка для конкретной платформы:

Никакой настройки для этого не требуется.

Функциональные возможности общего доступа работают путем вызова RequestAsync метода с полезными данными, которые содержат сведения для совместного использования другим приложениям. ShareTextRequest.Text и ShareTextRequest.Uri может быть смешанным, и каждая платформа будет обрабатывать фильтрацию на основе содержимого.

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

Общий доступ к файлу

Вы также можете предоставлять общий доступ к файлам другим приложениям на устройстве. .NET MAUI автоматически обнаруживает тип файла (MIME) и запрашивает общий ресурс. Однако операционные системы могут ограничить общий доступ к типам файлов. Чтобы предоставить общий доступ к одному файлу ShareFileRequest , используйте тип.

В следующем примере кода записывается текстовый файл на устройство, а затем запрашивается общий доступ к нему:

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

Общий доступ к нескольким файлам

Общий доступ к нескольким файлам немного отличается от общего доступа к одному файлу. Чтобы предоставить общий доступ к одному файлу ShareMultipleFilesRequest , используйте тип.

В следующем примере кода на устройство записывается два текстовых файла, а затем запрашивается общий доступ к ним:

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

Расположение презентации

Важно!

Этот раздел относится только к iPadOS.

При запросе общего ресурса или открытия средства запуска на iPadOS его можно представить во всплывающем ведении. Это указывает, где появится всплывающее окно и наведите стрелку непосредственно на нее. В этом расположении обычно указывается элемент управления, который инициировал действие. Расположение можно указать с помощью свойства 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
    });

Все описанное здесь также применимо к Share и Launcher.

Ниже приведен метод расширения, который помогает вычислить границы представления:

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

Затем при вызове 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
    }
}

Вы можете передать вызывающий элемент при активации Command:

<Button Text="Share"
        Command="{Binding ShareWithFriendsCommand}"
        CommandParameter="{Binding Source={RelativeSource Self}}"/>

Пример класса см. в примере ViewHelpers .NET MAUI, размещенном на сайте GitHub.

Различия между платформами

В этом разделе описываются различия платформы с API общего доступа.

  • Свойство ShareTextRequest.Subject используется для требуемой темы сообщения.