我需要为每个页面注册不同的共享魅力监听器。我有2页。我在每一个中添加了以下代码:
DataTransferManager.GetForCurrentView().DataRequested += App_DataRequested;
我在一个页面的构造函数中添加了它,在另一个的UserControl_Loaded事件中添加了它(第一页只是没有UserControl_Loaded,所以为什么我将它直接添加到构造函数中)。在第二页尝试加载的那一刻,我得到了例外:
WinRT information: An event handler has already been registered
Additional information: A method was called at an unexpected time.
我应该把它放在哪里以及“正确”的时间是什么时候? 同样令人困惑的是,我们为每个视图都有不同的DataTransferManager,但当前只有一个是活动的。我注意到,如果你只为第一页添加一个监听器,那么其他页面无论如何都会共享这个监听器。如果我对所有页面只有一个共享侦听器,它是否正确在app.xaml.cs中注册?
答案 0 :(得分:2)
我解决此问题的方法是在onNavigatedfrom事件中取消注册事件,如下所示:
protected override void OnNavigatedFrom(NavigationEventArgs e) { DataTransferManager.GetForCurrentView()。DataRequested - = App_DataRequested; base.OnNavigatedFrom(E); }
答案 1 :(得分:1)
在构造函数的BasePage.cs中我添加了
public BasePage()
{
if (!_isListenToDataRequested)
{
_isListenToDataRequested = true;
DataTransferManager manager = DataTransferManager.GetForCurrentView();
manager.DataRequested += AppDataRequested;
}
}
private async void AppDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
IShareable shareable = Frame.Content as IShareable;
if (shareable != null)
{
DataRequestDeferral deferral = args.Request.GetDeferral();
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => shareable.AppDataRequested(sender, args));
deferral.Complete();
}
}
我的所有页面都是
public sealed partial class ContentPage : IShareable
{
public void AppDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{...}
}
答案 2 :(得分:0)
另一个解决方案如下所示
private DataTransferManager dataTransferManager;
将此信息放入页面加载事件
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
{
this.dataTransferManager = DataTransferManager.GetForCurrentView();
this.dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.OnDataRequested);
}));
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
// Unregister the current page as a share source.
this.dataTransferManager.DataRequested -=
new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>
(this.OnDataRequested);
}
答案 3 :(得分:0)
我建议在导航事件中执行此操作,OnNavigatingFrom事件将在您要访问的页面的OnNavigatingTo之前触发,因此您不会遇到此问题。
protected override Task OnNavigatingTo(WinRTXamlToolkit.Controls.AlternativeNavigationEventArgs e)
{
DataTransferManager.GetForCurrentView().DataRequested += dataTransfer_DataRequested;
return base.OnNavigatingTo(e);
}
protected override Task OnNavigatingFrom(WinRTXamlToolkit.Controls.AlternativeNavigatingCancelEventArgs e)
{
DataTransferManager.GetForCurrentView().DataRequested -= dataTransfer_DataRequested;
return base.OnNavigatingFrom(e);
}
//Note: This is the WinRT Xaml Toolkit version of the events, but the standard events will work the same way.