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是我为几个应用程序所做的。