リストから 1 つを選択すると、パワーポイントを WPF 要素に変換する WPF アプリケーションを構築しています。ViewModel をビューにバインドし、ViewModel 間の通信を追加するために、MVVM ライトを使用しています。
OpenLocalView と PresentationView の 2 つのビューがあります。OpenLocalView でパワーポイントを選択すると、MVVM ライトによって、PresentationView の ViewModel とそのパワーポイントへのパスを含む MainViewModel にメッセージが送信されます。MainViewModel はビューを PresentationView に切り替え、PresentationViewModel はこのコードを実行してパワーポイントを変換します。変換が完了したら、現在のスライドを設定して、PresentationView に表示されるようにします。
  public void StartPresentation(string location)
  {
        var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
        Loading = true;
        Task.Factory.StartNew(() =>
            {
                var converterFactory = new ConverterFactory();
                var converter = converterFactory.CreatePowerPointConverter();
                _slides = converter.Convert(location).Slides;
            }, 
            CancellationToken.None, 
            TaskCreationOptions.LongRunning, 
            scheduler).ContinueWith(x =>
                {
                    Loading = false;
                    CurrentSlide = _slides.First();
                }, 
                CancellationToken.None, 
                TaskContinuationOptions.OnlyOnRanToCompletion, 
                scheduler);
   }
Loading プロパティが設定されている場合、ビューは「読み込み中」メッセージで更新され、UI の応答性が向上します。
    public Boolean Loading
    {
        get { return _loading; }
        set
        {
            _loading = value;
            RaisePropertyChanged("Loading");
        }
    }
問題は、これが最初にパワーポイントを読み込んだときに正しく実行されることです。ビューがPresentationViewに切り替わり、「読み込み中」メッセージが表示され、変換が完了すると、メッセージが消えてスライドが表示されます。しかし、OpenLocalView に戻って別のパワーポイントを選択すると、OpenLocalView がハングし、コンバーターの終了後に PresentationView に切り替わり、「読み込み中」メッセージがまったく表示されません。
参考までに、関連するコードをいくつか追加します。
これは、OpenLocalViewModel でパワーポイントが選択されたときに実行されます。
    private void PerformOpenPresentation(string location)
    {
        Messenger.Default.Send<OpenPowerPointMessage>(new OpenPowerPointMessage {Location = location});
    }
MainViewModel はメッセンジャーにサブスクライブされ、ビューを切り替えます。
Messenger.Default.Register<OpenPowerPointMessage>(this,
            delegate
            {
                if (_presentation == null) _presentation = new PresentationView();
                CurrentView = _presentation;
            });
PresentationViewModel もメッセンジャーにサブスクライブされ、上記のメソッドを実行します。
Messenger.Default.Register<OpenPowerPointMessage>(this, message => StartPresentation(message.Location));
それで、私は何を間違っていますか?繰り返しますが、同じコードが実行されますが、一度は問題なく実行され、その後は実行されません。