共有
この記事では、.NET Multi-platform App UI (.NET MAUI) IShare インターフェイスを使用する方法について説明します。 このインターフェイスは、テキストや Web リンクなどのデータをデバイス共有機能に送信する API を提供します。
IShare
インターフェイスの既存の実装は、Share.Default プロパティを通じて使用できます。 IShare
インターフェイスと Share
クラスは、どちらも Microsoft.Maui.ApplicationModel.DataTransfer
名前空間に含まれています。
共有要求が行われると、デバイスに共有ウィンドウが表示され、ユーザーは、共有先となるアプリを選択するように求めれます。
作業の開始
共有機能にアクセスするには、次のプラットフォーム固有の設定が必要です。
設定は必要ありません。
テキストとリンクを共有する
共有機能は、他のアプリケーションと共有する情報が含まるデータ ペイロードを指定して 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) を自動的に検出し、共有を要求します。 ただし、オペレーティング システムでは、共有できるファイルの種類が制限される場合があります。 1 つのファイルを共有するには、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)
});
}
複数のファイルを共有する
複数のファイルの共有は、1 つのファイルの共有とは若干異なります。 1 つのファイルを共有するには、ShareMultipleFilesRequest 型を使用します。
次のコード例では、2 つのテキスト ファイルをデバイスに書き込み、共有を要求します。
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
クラスの例については、「GitHub でホストされている .NET MAUI サンプル」をご覧ください。
プラットフォームによる違い
この節では、共有 API に関するプラットフォーム固有の違いについて説明します。
- ShareTextRequest.Subject プロパティは、必要なメッセージ件名に使用されます。
.NET MAUI