什么是为Share / Search魅力注册监听器的合适时间

时间:2012-05-16 15:54:13

标签: windows-8 windows-runtime

我需要为每个页面注册不同的共享魅力监听器。我有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中注册?

4 个答案:

答案 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.