3

ページごとに異なる共有チャーム リスナーを登録する必要があります。2ページあります。すべてに次のコードを追加しました。

        DataTransferManager.GetForCurrentView().DataRequested += App_DataRequested;

あるページのコンストラクターと別のページの UserControl_Loaded イベントに追加しました (最初のページには UserControl_Loaded がないため、コンストラクターに直接追加した理由)。2 番目のページを読み込もうとした瞬間に、例外が発生しました。

WinRT information: An event handler has already been registered
Additional information: A method was called at an unexpected time.

どこに配置する必要があり、これを行う「適切な」時間はいつですか?? また、ビューごとに異なる DataTransferManager があることもわかりにくく見えますが、現在アクティブなのは 1 つだけです。さらに、最初のページにリスナーを 1 つだけ追加すると、他のページがこのリスナーを共有することに気付きました。すべてのページに共有リスナーが 1 つしかない場合、それを app.xaml.cs に正しく登録できますか?

4

4 に答える 4

2

この問題を解決する方法は、以下のように onNavigatedfrom イベントでイベントの登録を解除することでした。

protected override void OnNavigatedFrom(NavigationEventArgs e) { DataTransferManager.GetForCurrentView().DataRequested -= App_DataRequested; base.OnNavigatedFrom(e); }

于 2012-12-07T05:37:21.960 に答える
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)
    {...}
}
于 2013-04-12T18:03:36.903 に答える
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);
    }
于 2013-03-11T08:58:21.157 に答える