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
相关产品推荐
相关产品推荐

