1

アプリケーションの QueryString に問題があります。メインページに 2 つのボタンがあります。ユーザーがボタンをクリックすると、アプリケーションは 2 番目のページに移動し、ボタン ID を Querystring に保存します。

今、私が抱えている問題は、ユーザーがボタンをクリックすると、クエリ文字列の「ID」キーが対応する ID 値に設定されますが、その ID の値が永続的になるということです。

すなわち

Button1 => NavigationService("/Page2.xaml?ID=1",UriKind.Relative) => page2 の onNavigated イベントで着信 ID 値を確認すると、2 ページ目で Querystring が ID に正常に設定されていることがわかります。

ただし、戻るボタンをクリックした場合は、button2 を押します

Button2 => NavigationService("/Page2.xaml?ID=2",UriKind.Relative) => page2 の onNavidated イベントの QueryString 値を確認すると、ID キーの値が 1 のままであることがわかります。

ボタン 2 を押して開始した場合、ID キーの永続値は 2 になります。

何が起こっているのかまったくわかりません.ページ間のページ遷移をアニメーション化しましたが、それがどのように影響するかわかりません.何が起こっているのか考えている人はいますか? メインページに戻った場合、アプリ全体をリセットする方法はありますか?

メインページで

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);
            animation1.Stop();
            animation2.Stop();
            animation1.Begin();
        }


        private void button1_Click(object sender, RoutedEventArgs e)
        {          
            animation2.Begin();
            animation2.Completed += (x, y) => NavigationService.Navigate(new Uri("/fooApp;component/Page2.xaml?id=1", UriKind.Relative));                           
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            animation2.Begin();
            animation2.Completed += (x, y) => NavigationService.Navigate(new Uri("/fooApp;component/Page2.xaml?id=2", UriKind.Relative));          
        }

        private void button3_Click(object sender, RoutedEventArgs e)
        {
            animation2.Begin();
            animation2.Completed += (x, y) =>   NavigationService.Navigate(new Uri("/fooApp;component/Page2.xaml?id=3", UriKind.Relative));      
        }

ページ 2 で

  protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e )
    {

       base.OnNavigatedTo(e);

       animation1.Stop();
       animation2.Stop();
       animation1.Begin();

    }

ところで、Page2 Page Loaded イベント全体をコメントアウトしました。

アップデート

私が気づいたことの 1 つは、プログラムが 2 番目の Navigation 呼び出しさえ実行せず、最初の呼び出しのみを実行することです。これを知っているのは、button2 の Uri ソースを空の文字列に変更し、button1 をボタンにしてプログラムを実行すると、それが最初に押されると、どのボタンに戻って押しても、クエリ文字列の値が 1 のままになります。page2 の OnNavigatedTo イベントで NavigationEventArgs e オブジェクトを調べると、その URI ソースは常に最初の uri ソースになります。

私の推測では、animation2.Completed イベントはある種のマルチキャスト デリゲートとして機能していると思います。最初に入れられるものは何でも実行されます。うまくいきますが、アニメーションはありません.animation2.Completedイベントをクリアする方法を知っている人はいますか? または、代替の実装に関するアイデアがあります。

4

1 に答える 1

1

Completed基本的に、ストーリーボードにハンドラーを追加しています。ハンドラーはCompletedページ 2 に移動します。次に、戻って 2 番目のボタンを押します。前のページに戻ったので、同じページ インスタンスを再利用しているため、同じStoryboardインスタンスを使用しています。これで、2 番目のCompletedハンドラーをStoryboard. したがって、アニメーションStoryboardが終了すると、2 つのCompletedハンドラーがあり、最初のハンドラーが最初に実行され、最初のパラメーターで Page2 に移動します。

Completedハンドラーを毎回追加するのではなく、一度だけ追加して、URL をプロパティに保存します。

XAML で:

<Storyboard x:Key="Animation2" Completed="Storyboard_Completed">
    <!-- whatever-->
</Storyboard>    

次に、C# コードで次のようにします。

protected string Uri { get; set; }

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    animation1.Stop();
    animation2.Stop();
    animation1.Begin();
}

private void button1_Click(object sender, RoutedEventArgs e)
{          
    this.Uri = "/fooApp;component/Page2.xaml?id=1";
    animation2.Begin();                       
}

private void button2_Click(object sender, RoutedEventArgs e)
{
    this.Uri = "/fooApp;component/Page2.xaml?id=2";
    animation2.Begin();          
}

private void button3_Click(object sender, RoutedEventArgs e)
{
    this.Uri = "/fooApp;component/Page2.xaml?id=3";
    animation2.Begin();              
}

private void Storyboard_Completed(object sender, EventArgs e)
{
    this.NavigationService.Navigate(new Uri(this.Uri, UriKind.Relative));      
}

ボーナス:

イベント ハンドラーの削除

イベント ハンドラーを削除する場合は、単に-=演算子を使用します。ただし、ラムダを使用することはできません。「古典的な」方法を使用する必要があります。

// Good
this.animation2.Completed -= Storyboard_Completed;

// Wrong
this.animation2.Completed -= (sender, e) => NavigationService.Navigate(new Uri("RandomText_JustWantCompletedEventToBeHit", UriKind.Relative));    

代替実装

Tagすべてのボタンがアニメーションをトリガーして Page2 にリダイレクトするだけの場合は、コントロールのプロパティのおかげで、より一般的な方法で処理できます。プロパティを使用Tagすると、コントロールを識別したい任意のオブジェクトを格納できます。

XAML:

<Button Click="Button_Click" Content="Button 1" Tag="1" />
<Button Click="Button_Click" Content="Button 2" Tag="2" />
<Button Click="Button_Click" Content="Button 3" Tag="3" />

C#:

private void Button_Click(object sender, RoutedEventArgs e)
{
     var element = (FrameworkElement)sender;
     this.Url = "/fooApp;component/Page2.xaml?id=" + element.Tag.ToString();

     animation2.Begin();
}
于 2012-11-25T09:48:18.767 に答える