0

私の Windows ストア アプリでは、Microsoft のガイドラインに従って、終了後にアプリを再開しました ( http://goo.gl/oZ7BG )。それはすべて機能しますが、アプリが終了した後、ログインページ(アプリの最初のページ)にジャンプして、アプリのメニューページに直接移動したいと思います。Dropbox アプリとまったく同じです。私は App.xaml.cs とこのメソッドに取り組む必要があることを知っています:

protected async override void OnLaunched(LaunchActivatedEventArgs args)
    {
        Frame rootFrame = Window.Current.Content as Frame;

        // Do not repeat app initialization when the Window already has content,
        // just ensure that the window is active
        bool appTerminated = false;
        if (rootFrame == null)
        {
            // Create a Frame to act as the navigation context and navigate to the first page
            rootFrame = new Frame();
            marketingHP.Common.SuspensionManager.RegisterFrame(rootFrame, "appFrame");

            if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
            {
                //TODO: Load state from previously suspended application
                await marketingHP.Common.SuspensionManager.RestoreAsync();
                appTerminated = true;
            }

            // Place the frame in the current Window
            Window.Current.Content = rootFrame;
        }

        if (rootFrame.Content == null)
        {
            // When the navigation stack isn't restored navigate to the first page,
            // configuring the new page by passing required information as a navigation
            // parameter
            if (appTerminated)
                rootFrame.Navigate(typeof(HomePage), args.Arguments);
            else if (!rootFrame.Navigate(typeof(LoginPage), args.Arguments))
            {
                throw new Exception("Failed to create initial page");
            }
        }
        // Ensure the current window is active
        Window.Current.Activate();
    }

アプリが以前に終了したことをどのように理解できますか? bool appTerminated を追加しましたが、サスペンドに対してのみ機能することに注意してください...

4

1 に答える 1

1

Windows 8 アプリのライフサイクルについて詳しくは、http: //msdn.microsoft.com/en-us/library/windows/apps/hh464925.aspxをご覧ください。

特に、PreviousExecutionState プロパティに関するセクションと、そこに含まれるさまざまな終了状態の概要を示す表に注意してください。あなたがしたいことは、PreviousExecutionState の値をチェックすることのようです。その値が、ログイン ページをスキップしたい条件を反映している場合 (たとえば、ユーザーが既にログインしている場合)、ホームページに移動する必要があります。上記でやろうとしたことと同様です。

アプリを手動で閉じていて、Windows がリソースの制約のためにアプリを終了しない場合、またはアプリが予期せず閉じられた場合、 はappTerminatedに設定されませんtrue

それ以外の:

if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)

アプリがユーザーによって終了されたかどうかを確認するチェックを含めます。

if (args.PreviousExecutionState == ApplicationExecutionState.Terminated ||
    args.PreviousExecutionState == ApplicationExecutionState.ClosedByUser)

これは、リソースの制約により Windows がアプリを終了したときと、ユーザーが手動でアプリを終了したときの両方をキャッチします。次に、終了からの起動時appTerminatedに true に設定する必要があり、アプリは に直接移動する必要がありHomePageます。

編集:

コメントへの回答として、App.xaml ファイル内で、Navigate 呼び出しで渡される引数を変更するロジックを提供することができます。次のようなことができます。

string navArgs = "FromApp";
if (appTerminated)
{
    navArgs = "FromTerminated";
}

次に、Navigate を呼び出すときにこれを HomePage に渡すだけです。

if (appTerminated)
{
    rootFrame.Navigate(typeof(HomePage), navArgs);
}

ここで、HomePage コード ビハインド ファイルで、OnNavigatedTo メソッドを定義します。これは NavigatedEventArgs を取り、それを何らかのオブジェクト (この場合はString) としてキャストし、何が渡されたかを確認します。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    string navArgs = e.Parameter as String;
    switch (navArgs)
    {
    case "FromApp":
        //Do something here
        break;
    case "FromTerminated":
        //Do something different here
        break;
    default:
        break;
    }
}

お役に立てれば!

于 2013-11-06T23:45:33.293 に答える