Microsoft Prism フレームワークを利用している WPF アプリケーションに取り組んでいます。アプリケーションの 1 つの側面は、ウィンドウ全体にオーバーレイする任意の数のモーダル ウィンドウを保持できる "モーダル" 領域です。より多くのビューが領域にナビゲートされると、各ウィンドウが右にスライドして、新しいウィンドウが画面の中央を占めるようになります。より視覚的な説明は次のとおりです。
「モーダル」領域に単一のビューが含まれている場合:
別のビューがリージョンに追加されると:
さらにいくつかのビューが追加された場合:
私はこれを、その子のアニメーションと表示を管理するカスタム コントロールを使用して動作させています。コントロールの customRegionAdapter
のAdapt
メソッドは次のようになります。
protected override void Adapt(IRegion region, ModalContainer regionTarget)
{
region.ActiveViews.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler((o, e) =>
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
foreach(FrameworkElement element in e.NewItems)
{
regionTarget.AddChild(element);
}
}
else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
{
foreach (FrameworkElement element in e.OldItems)
{
regionTarget.RemoveChild(element);
}
}
});
}
私の質問は次のとおり です。以前のウィンドウに戻るための最良の方法は何ですか? 現在、RemoveChild
上記のメソッドをトリガーする唯一の方法は、領域からビューを明示的に削除することです。これには、現在領域にあるすべてのビューのリストをどこかに保持する必要があります。
// to remove the most recently added view from the region
_regionManager.Regions["ModalRegion"].Remove(addedViews.Pop());
RegionAdapter
理想的には、Prism の「ジャーナリング」の概念を使用して後方にナビゲートできるようにしますが、既にリージョン内にあるビューが再ナビゲートされたときに応答する方法がわかりません。
どんなヒントでも大歓迎です。
編集
GOstrowsky の提案に従うことで、この機能を実現することができました (受け入れられた回答のコメントを参照してください)。リージョン アダプターを変更して、リージョン内のアクティブなビュー (現在画面の中央にあるビュー) を 1 つだけ維持するようにしました。次に、 を介してそのビューを削除対象にできますmyRegion.ActiveViews.FirstOrDefault()
。
まだ別の編集
最後のビューだけでなく、現在リージョンにあるビューを削除する機能が必要だったため、この実装を再度変更しました。詳細については、受け入れられた回答を参照してください。