如何在.NET MAUI桌面应用中获取共享对话框内容?
在.NET MAUI Windows桌面应用中接收共享内容的实现方法
当你的Windows应用已配置为共享目标后,可通过以下步骤捕获并处理共享对话框中的内容:
1. 重写Windows项目的激活事件
在Platforms/Windows/App.xaml.cs文件中,重写OnActivated方法——这是应用被作为共享目标激活时的入口点:
using Windows.ApplicationModel.Activation; using Windows.ApplicationModel.DataTransfer; using Windows.Storage; namespace YourAppName.WinUI; public partial class App : MauiWinUIApplication { protected override void OnActivated(IActivatedEventArgs args) { base.OnActivated(args); // 判断是否为共享目标激活 if (args.Kind == ActivationKind.ShareTarget) { var shareArgs = args as ShareTargetActivatedEventArgs; if (shareArgs?.ShareOperation != null) { // 异步处理共享内容 _ = HandleSharedContentAsync(shareArgs.ShareOperation); } } } private async Task HandleSharedContentAsync(ShareOperation shareOperation) { try { // 处理共享文本 if (shareOperation.Data.Contains(StandardDataFormats.Text)) { string sharedText = await shareOperation.Data.GetTextAsync(); // 将内容传递给MAUI跨平台逻辑 SendSharedContentToMaui(sharedText); } // 处理共享文件/存储项 if (shareOperation.Data.Contains(StandardDataFormats.StorageItems)) { var storageItems = await shareOperation.Data.GetStorageItemsAsync(); foreach (var item in storageItems.OfType<StorageFile>()) { // 示例:获取文件路径 string filePath = item.Path; // 传递文件信息到MAUI SendSharedFileToMaui(filePath); } } } finally { // 必须调用此方法告知系统共享操作完成 shareOperation.ReportCompleted(); } } }
2. 将共享内容传递到MAUI跨平台部分
Windows项目代码属于平台特定逻辑,需通过消息传递机制将内容同步到MAUI跨平台层,推荐使用CommunityToolkit.Mvvm的WeakReferenceMessenger(替代已弃用的MessagingCenter):
步骤1:定义消息类(跨平台项目中)
using CommunityToolkit.Mvvm.Messaging.Messages; namespace YourAppName; // 文本共享消息 public class SharedTextMessage : ValueChangedMessage<string> { public SharedTextMessage(string value) : base(value) { } } // 文件共享消息 public class SharedFileMessage : ValueChangedMessage<string> { public SharedFileMessage(string value) : base(value) { } }
步骤2:在Windows项目中发送消息
在HandleSharedContentAsync方法中添加发送逻辑:
using CommunityToolkit.Mvvm.Messaging; private void SendSharedContentToMaui(string text) { WeakReferenceMessenger.Default.Send(new SharedTextMessage(text)); } private void SendSharedFileToMaui(string filePath) { WeakReferenceMessenger.Default.Send(new SharedFileMessage(filePath)); }
步骤3:在MAUI页面/ViewModel中接收消息
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Messaging; namespace YourAppName.ViewModels; public partial class MainViewModel : ObservableObject, IRecipient<SharedTextMessage>, IRecipient<SharedFileMessage> { [ObservableProperty] private string receivedSharedText; [ObservableProperty] private string receivedSharedFilePath; public MainViewModel() { // 注册消息接收 WeakReferenceMessenger.Default.RegisterAll(this); } public void Receive(SharedTextMessage message) { ReceivedSharedText = message.Value; // 在这里处理共享文本的业务逻辑 } public void Receive(SharedFileMessage message) { ReceivedSharedFilePath = message.Value; // 在这里处理共享文件的业务逻辑 } }
关键注意事项
- 必须调用
shareOperation.ReportCompleted():系统会等待此调用确认共享操作完成,否则会显示应用未响应的提示。 - 异步处理:共享内容的获取(如文件读取)需用异步方法,避免阻塞UI线程。
- 权限:若共享的是受保护的文件,可能需要额外配置文件访问权限。
内容的提问来源于stack exchange,提问作者carlos
相关产品推荐
相关产品推荐

