3

ユーザーが前方にナビゲートできないように、ページからNavigationService.Navigatingイベントをキャッチしたいと思います。このように定義されたイベントハンドラーがあります。

void PreventForwardNavigation(object sender, NavigatingCancelEventArgs e)
{
    if (e.NavigationMode == NavigationMode.Forward)
    {
        e.Cancel = true;
    }
}

...そしてそれはうまくいきます。ただし、このコードをどこに配置するかは正確にはわかりません。

NavigationService.Navigating += PreventForwardNavigation;

これをページのコンストラクターまたはInitializedイベントハンドラーに配置すると、NavigationServiceはnullのままになり、NullReferenceExceptionが発生します。ただし、ページのLoadedイベントハンドラーに配置すると、ページに移動するたびに呼び出されます。私が正しく理解していれば、それは私が同じイベントを複数回処理していることを意味します。

同じハンドラーをイベントに複数回追加しても大丈夫ですか(ページのLoadedイベントを使用してフックする場合と同じように)?そうでない場合、初期化とロードの間にこの配線を行うことができる場所はありますか?

4

2 に答える 2

1

@Espoあなたのリンクは、回避策を見つけるのに役立ちました。醜いので回避策と呼んでいますが、MS自身がドキュメントで行っていることです。

public MyPage() // ctor
{
    InitializeComponent();
    this.Loaded += delegate { NavigationService.Navigating += MyNavHandler; };
    this.Unloaded += delegate { NavigationService.Navigating -= MyNavHandler; };
}

したがって、基本的には、ページがアンロードされたときにナビゲーションサービスのイベントの購読を解除する必要があります。

私がそれを見つけるのを手伝ってくれたあなたの応答に+1。自分の回答を「合格回答」としてマークできないようですので、とりあえずそのままにしておきます。

于 2008-08-25T07:36:17.020 に答える
1

NavigationService.NavigateNavigationService.Navigatingイベントとイベントの両方をトリガーしますApplication.Navigating。この問題を次の方法で解決しました。

public class PageBase : Page
{
    static PageBase()
    {
        Application.Current.Navigating += NavigationService_Navigating;
    }

    protected static void NavigationService_Navigating(object sender, NavigatingCancelEventArgs e)
    {
        // put your event handler code here...
    }
}
于 2011-07-28T17:29:40.253 に答える