5

最近、IE からファイルを開くときにアプリケーションの分離ストレージにファイルを保存するためのカスタム UriMapper を追加しました。このコードは次のようになります。

class AssociationUriMapper : UriMapperBase
{
    public override Uri MapUri(Uri uri)
    {
        var tempUri = uri.ToString();

        if (tempUri.Contains("/FileTypeAssociation"))
        {                
            int fileIdIndex = tempUri.IndexOf("fileToken=") + 10;
            string fileId = tempUri.Substring(fileIdIndex);

            SaveFileToIsolatedStorage(fileId);

            return new Uri("/MainPage.xaml", UriKind.Relative);                
        }

        return uri;
    }
}

InitializePhoneApplication()で私は

RootFrame.UriMapper = new AssociationUriMapper();

もちろん、 WMAppManifest.xmlにExtensionsタグを追加しました。

これはすべて正常に動作します...しかし、奇妙な動作に気付きました。IE からファイルを開くたびに、ファイルのコピーが 2 つ取得されます。オーバーライドされた MapUri 内にブレークポイントを配置すると、アプリケーションが IE から自動起動するたびに 2 回ヒットします。

これをさらに調査し始めたとき、 NavigateService.Navigate()を呼び出すたびにこれが発生することに気付き ました。しかし、NavigateService.GoBackを呼び出すときはそうではありません。

なぜこれが起こっているのか誰にも分かりますか?Navigate()が呼び出されたときにMapUri()が 2 回呼び出されるのはなぜですか? ページの新しいインスタンスが作成されたときに発生するものですか? ( Navigate()を呼び出すと、呼び出されたページの新しいインスタンスが作成されますが、GoBack()を呼び出すと、移動元のページの既に作成されたインスタンスが取得されることに気付きました)。

編集:
私は今、ゼロから小さなテストアプリケーションを作成しました。結果は同じです。UriMapperBaseから継承し、 MapUriメソッドをオーバーライドするクラスがある場合、アプリケーションに移動するか、アプリケーションでNavigateService.Navigate()を呼び出すたびに、 MapUriが 2 回呼び出されます。

私の問題の明らかな回避策は、もちろん、アプリケーションがナビゲートする別のページを用意し、そのページがSaveFileToIsolatedStorage()を呼び出すことです。しかし、それでは、なぜ動作がそのままなのかという疑問にはまだ答えていません。

4

3 に答える 3

3

コードではなく ViewModel を使用して、MainPage の XAML を介して UriMapper を接続してみてください。

于 2014-05-28T20:45:27.020 に答える
0

それが私がすることです:

public class AppUriMapper : UriMapperBase
{
    public static bool IsNavigating = false;

    public override Uri MapUri(Uri uri)
    {
        var endUri = uri;

        if (IsNavigating)
        {
            IsNavigating = false;

            //blabla......
        }

        System.Diagnostics.Debug.WriteLine("goto: [origin] {0} [dest] {1}", uri, endUri);

        return endUri;
    }
}

App.cs で:

RootFrame.Navigating += (s, e) =>
        {
            AppUriMapper.IsNavigating = true;
            System.Diagnostics.Debug.WriteLine("goto: [mode] {0}, [uri] {1}", e.NavigationMode, e.Uri);
        };

大丈夫です。

于 2015-03-25T07:57:01.563 に答える