Windows 8 什么时候注册共享/搜索功能的侦听器

Windows 8 什么时候注册共享/搜索功能的侦听器,windows-8,windows-runtime,Windows 8,Windows Runtime,我需要为每个页面注册不同的共享魅力侦听器。我有两页。我在每个代码中都添加了以下代码: DataTransferManager.GetForCurrentView().DataRequested += App_DataRequested; 我在一个页面的构造函数和另一个页面的UserControl_Loaded事件中添加了它(第一个页面只是没有加载UserControl_,所以我直接将它添加到构造函数中)。在第二页尝试加载时,我遇到了异常: WinRT information:

我需要为每个页面注册不同的共享魅力侦听器。我有两页。我在每个代码中都添加了以下代码:

        DataTransferManager.GetForCurrentView().DataRequested += App_DataRequested;
我在一个页面的构造函数和另一个页面的UserControl_Loaded事件中添加了它(第一个页面只是没有加载UserControl_,所以我直接将它添加到构造函数中)。在第二页尝试加载时,我遇到了异常:

WinRT information: An event handler has already been registered
Additional information: A method was called at an unexpected time.
我应该把它放在哪里,什么是做这件事的“正确”时间??
此外,每个视图都有不同的DataTransferManager,但当前只有一个视图处于活动状态,这看起来令人困惑。而且,我注意到,如果您只为第一个页面添加一个侦听器,其他页面将共享该侦听器。如果所有页面只有一个共享侦听器,在app.xaml.cs中注册是否正确

我解决此问题的方法是在onNavigatedfrom事件中注销事件,如下所示:

受保护的覆盖无效OnNavigatedFrom(NavigationEventArgs e) { DataTransferManager.GetForCurrentView().DataRequested-=App_DataRequested; 基于(e)的导航;
}

另一个解决方案如下运行

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);
    }
将其放入页面加载事件中

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);
    }
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,新的DispatchedHandler(()=>
{
this.dataTransferManager=dataTransferManager.GetForCurrentView();
this.dataTransferManager.DataRequested+=新类型deventhandler(this.OnDataRequested);
}));

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);
    }
受保护的覆盖无效OnNavigatedFrom(NavigationEventArgs e)
{
//将当前页注销为共享源。
此文件为.dataTransferManager.DataRequested-=
新型电动铲运机
(本条要求);
}

我建议在导航事件中执行此操作,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.

在构造函数中的BasePage.cs中,我添加了

我所有的页面看起来都像

public sealed partial class ContentPage : IShareable
{
    public void AppDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
    {...}
}

是的,app.xaml.cs是我为几个应用程序所做的。