0

Microsoft Prism フレームワークを利用している WPF アプリケーションに取り組んでいます。アプリケーションの 1 つの側面は、ウィンドウ全体にオーバーレイする任意の数のモーダル ウィンドウを保持できる "モーダル" 領域です。より多くのビューが領域にナビゲートされると、各ウィンドウが右にスライドして、新しいウィンドウが画面の中央を占めるようになります。より視覚的な説明は次のとおりです。

「モーダル」領域に単一のビューが含まれている場合:

とき

別のビューがリージョンに追加されると:

リージョンに別のビューが追加されたとき

さらにいくつかのビューが追加された場合:

さらにいくつかのビューが追加された場合

私はこれを、その子のアニメーションと表示を管理するカスタム コントロールを使用して動作させています。コントロールの customRegionAdapterAdaptメソッドは次のようになります。

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()

まだ別の編集

最後のビューだけでなく、現在リージョンにあるビューを削除する機能が必要だったため、この実装を再度変更しました。詳細については、受け入れられた回答を参照してください。

4

2 に答える 2

1

ときどき前のViewに戻りたい場合は、そこから移動するときにリージョンからそれを削除しないでください。

代わりに、 OnNavigatedFrom()メソッドから無効にすることができます。次に、NavigationJournalを使用して戻ります。

RegionAdapterコントロールに関しては、ビューのアクティブ化と非アクティブ化を処理できるように変更できます。たとえば、各ViewModel OnNavigatedFrom()およびOnNavigatedTo( ) からDe/ActivationChangedイベントを発行し、サブスクライブして各イベントに対応するタスクを実行することにより、カスタム コントロールでこれらのイベントを処理できます。

ナビゲーションとイベント集約の詳細については、 MSDN Prism ガイドの次の章を参照してください。

これがお役に立てば幸いです、よろしく。

于 2014-03-17T18:20:56.077 に答える
0

最初は、単一の領域のみをアクティブにすることでこの問題を解決しました。これにより、領域の現在アクティブなビューを削除すると、現在画面の中央にあるビューが常に削除されることが保証されました。ただし、それ以来、最初のビューだけでなく、リージョンから任意のビューを削除する機能が必要になりました。これを実現するために、Region.Viewsプロパティを にキャストしてからListインデックスでアクセスできることに気付きました。

List<object> allViews = modalRegion.Views.ToList<object>();

定義は;ではなくIViewsCollectionから継承されるため、このソリューションには少し不快です。技術的には、... にキャストできないカスタムを渡される可能性がありますが、短期的にはこれで実行します。IEnumerableIListIViewsCollectionIList

于 2014-03-26T19:53:47.337 に答える