0

したがって、私のシナリオは、page1.xaml にクリック可能な項目のリストがあるというものです。アイテム #1、#2、#3 とします。それらのいずれかをクリックすると、ユーザーには page2.xaml が表示されます (たとえば、ユーザーはアイテム #1、#2、または #3 のコンテンツを表示する前にログインする必要があります)。

したがって、page2.xaml には「ログイン」ボタンがあります。どのアプリがユーザーをログインさせ、「次のページ」を表示するかをクリックします。「次のページ」は、アイテム #1、#2、または #3 のコンテンツにすることができます。

たとえば、「次のページ」にはパラメーターが必要な場合があるため、次のページを相対 URL の文字列として保存したくありません。たとえば、アイテム #2 を表示するには、アイテム ID とその他のパラメーターを渡す必要があります。

そのため、「次のページ」と、その次のページに移動するときに渡すパラメーターを認識できるように、page2.xaml を設定する必要があります。

これが私が思いついたコードです...ページ#1があります。

public partial class Page1 : PhoneApplicationPage
{
    public Page1()
    {
        InitializeComponent();
    }
private object[] parametersForNextPage;
protected override OnNavigatedFrom(NavigationEventArgs e)
{
        if (e.Content is Page2 )
        {
            if (parametersForNextAction != null)
            {
                var mm = (Page2)e.Content;
    // The reason why I need to set mm.NextPage and mm.parameters is because the NextPage could be any page
                mm.NextPage = HandleActionFunc; // This is some another function that will be called after Page2        
                mm.parameters = parametersForNextPage; // HandleActionFunc needs parameters
            }
        }
}
    private void Item_Click(object sender, RoutedEventArgs e)
{
    var control = (SomeRandomUserControlDefinedByMe)sender;
            parametersForNextPage = control.parameters;
    PageNavController.NavigateToPage2();
}
}

次に、ページ#2があります:

public partial class Page2 : PhoneApplicationPage
{
public object[] parameters;
public Action<object[]> goToNextPage;
    public Page1()
    {
        InitializeComponent();
    }
    //...//
    private void Button_Click(object sender, EventArgs e)
{
    GoToNextPage(parameters);
}
}

さて、私が持っている質問は...これはメモリリークにつながる可能性がありますか?

これについてはよくわかりません...

Page2 には、Page1 の parametersForNextPage への参照であるパラメータ フィールドがあります。

これは、Page1 が Page2 に移動すると、Page2 は Page1 のフィールドへの参照を保持しているため、Page1 がガベージ コレクションされないようにするということですか?

しかし、この場合でも、Page2 から「次のページ」に移動すると、ガベージ コレクターは Page1 と Page2 を消去するのでしょうか?

コーディングに関する質問をオンラインで投稿することに慣れていないため、わかりにくかったかもしれませんが、この場合のガベージ コレクションがどのように機能するかについて、誰かが疑問を解消するのを手伝ってくれることを願っています。

これは、データを渡す最良の方法ではないかもしれません。その場合は、このロジックを実行する別の方法を提案してください。

乾杯

4

1 に答える 1

1

ではparametersForNextPage、Page1 への参照を保持するのではなく、Page1 によって参照されるオブジェクトへの参照を保持します。したがって、ガベージ コレクタに問題はありません。

私はもっ​​と心配するでしょうHandleActionFunc。表示されませんが、Page1 で宣言されたインスタンス メソッドである場合、ガベージ コレクターが Page1 をクリーニングできなくなります。

とはいえ、Page1 はバックスタックに存在する限りメモリに保持されることに注意してください。したがって、Page2 をナビゲートするときにバックスタックをクリアするつもりがない場合でも、Page1 はどちらの方法でも有効に保たれるため、心配する必要はありません。

于 2013-10-03T06:06:18.533 に答える