0

Catel フレームワークが大好きです。モダンな UI はかなり見栄えがします。しかし、それらを連携させようとしているときに問題に直面しました。

2 つの catels usercontrolsHomeとmuiSecondプロジェクトを追加しました。問題は、HomeからSecond実行への移行HomeViewModelが 3 回作成されたときです。

この動作は、次のコードによって引き起こされますTransitioningContentControl

    private void StartTransition(object oldContent, object newContent)
    {
        // both presenters must be available, otherwise a transition is useless.
        if (CurrentContentPresentationSite != null && PreviousContentPresentationSite != null) {
            CurrentContentPresentationSite.Content = newContent;

            PreviousContentPresentationSite.Content = oldContent;

            // and start a new transition
            if (!IsTransitioning || RestartTransitionOnContentChange) {
                IsTransitioning = true;
                VisualStateManager.GoToState(this, NormalState, false);
                VisualStateManager.GoToState(this, Transition, true);
            }
        }
    }

いくつかの行にコメントすると:

private void StartTransition(object oldContent, object newContent)
    {
        // both presenters must be available, otherwise a transition is useless.
        if (CurrentContentPresentationSite != null && PreviousContentPresentationSite != null) {
            CurrentContentPresentationSite.Content = newContent;

            //PreviousContentPresentationSite.Content = oldContent;

            // and start a new transition
            if (!IsTransitioning || RestartTransitionOnContentChange) {
                IsTransitioning = true;
                //VisualStateManager.GoToState(this, NormalState, false);
                //VisualStateManager.GoToState(this, Transition, true);
            }
        }
    }

この場合、同じトランジションで 1 回作成されますが、コントロールからのナビゲーションを実行中HomeViewModelに作成したくありません。どうすればこれを達成できますか?HomeViewModelHome

味わうプロジェクト

4

1 に答える 1

2

この問題を解決できるオプションが 2 つあります。

1) 既存の機能 (CloseViewModelOnUnloaded) を使用します。移行中に VM を維持します。

次に、TransitioningContentControl.StartTransition でこのコードが必要です

var userControl = oldContent as Catel.Windows.Controls.UserControl;
if (userControl != null)
{
    userControl.CloseViewModelOnUnloaded = false;
}

PreviousContentPresentationSite.Content = oldContent;

これを OnTransitionCompleted に追加します。

var userControl = PreviousContentPresentationSite.Content as Catel.Windows.Controls.UserControl;
if (userControl != null)
{
    userControl.CloseViewModelOnUnloaded = true;
    var vm = userControl.ViewModel;
    if (vm != null)
    {
        vm.CloseViewModel(true);
    }
}

AbortTransition();

2) 新機能 (PreventViewModelCreation) を使用する 移行中に VM を維持しません。

次に、TransitioningContentControl.StartTransition でこのコードが必要です

var vmContainer = oldContent as IViewModelContainer;
if (vmContainer != null)
{
    vmContainer.PreventViewModelCreation = true;
}

PreviousContentPresentationSite.Content = oldContent;

これを OnTransitionCompleted メソッドに追加します。

var vmContainer = PreviousContentPresentationSite.Content as IViewModelContainer;
if (vmContainer != null)
{
    vmContainer.PreventViewModelCreation = false;
}

AbortTransition();
于 2014-03-19T11:38:19.590 に答える