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

WPF中DataTransferManager的DataRequested事件未触发,无法设置分享内容求助

WPF中DataTransferManager的DataRequested事件未触发的解决方案

问题描述

在WPF应用中调用DataTransferManager展示原生分享UI时,窗口能正常打开,但DataRequested事件始终未被调用,无法设置需要分享的内容。测试项目配置如下:

.csproj文件

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>net8.0-windows10.0.26100.0</TargetFramework>
        <UseWPF>true</UseWPF>
    </PropertyGroup>

</Project>

MainWindow.xaml.cs原代码

using System.Windows;
using System.Windows.Interop;
using Windows.ApplicationModel.DataTransfer;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            var windowHandle = new WindowInteropHelper(this).Handle;
            DataTransferManagerInterop.ShowShareUIForWindow(windowHandle);
        }

        private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
        {
            var windowHandle = new WindowInteropHelper(this).Handle;
            var dtm = DataTransferManagerInterop.GetForWindow(windowHandle);
            dtm.DataRequested += OnDataRequested;
        }

        private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
        {
            var request = args.Request;
            request.Data.Properties.Title = "Share Test";
            request.Data.SetText("Some text to share");
        }
    }
}

解决方法

核心问题是原代码中DataTransferManager实例为局部变量,Loaded事件执行完成后会被垃圾回收,导致后续触发分享UI时没有有效的事件订阅者。只需将实例改为窗口类的成员变量,延长其生命周期即可。

修正后的MainWindow.xaml.cs代码

using System;
using System.Windows;
using System.Windows.Interop;
using Windows.ApplicationModel.DataTransfer;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        // 将DataTransferManager声明为类成员变量,绑定窗口生命周期
        private DataTransferManager _dtm;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            var windowHandle = new WindowInteropHelper(this).Handle;
            DataTransferManagerInterop.ShowShareUIForWindow(windowHandle);
        }

        private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
        {
            var windowHandle = new WindowInteropHelper(this).Handle;
            _dtm = DataTransferManagerInterop.GetForWindow(windowHandle);
            _dtm.DataRequested += OnDataRequested;
        }

        private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
        {
            var request = args.Request;
            request.Data.Properties.Title = "Share Test";
            request.Data.SetText("Some text to share");
        }

        // 可选:窗口关闭时取消事件订阅,避免内存泄漏
        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);
            if (_dtm != null)
            {
                _dtm.DataRequested -= OnDataRequested;
            }
        }
    }
}

补充说明

  • 确保DataTransferManager实例的生命周期与窗口一致,避免被GC回收。
  • 窗口关闭时取消事件订阅是良好的实践,可避免潜在的内存泄漏问题。

内容的提问来源于stack exchange,提问作者Colin Rosen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:43:13