You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:45:28