現在の状況
次のアプローチを使用して、一致する ViewModel のビューを解決しています。(簡体字)
<Window.Resources>
<ResourceDictionary>
<DataTemplate DataType="{x:Type local:DemoVm2}">
<local:DemoViewTwo />
</DataTemplate>
<DataTemplate DataType="{x:Type local:DemoVm}">
<local:DemoView />
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
<DockPanel LastChildFill="True">
<Button Content="Switch To VmOne" Click="ButtonBase_OnClick"></Button>
<Button Content="Switch To VmTwo" Click="ButtonBase_OnClick2"></Button>
<ContentPresenter Content="{Binding CurrentContent}" />
</DockPanel>
ビューは、ContentPresenter 内で ViewModel を切り替えた後、WPF によって自動的に解決されます。
初期化に 2 ~ 4 秒かかる複雑なビューを使用する場合、BusyIndicator を表示したいと考えています。データではなくビジュアルの量が多いため、最大 2 ~ 4 秒かかります。
問題
現在のビューモデルにしかアクセスできないため、ビューの初期化/読み込みプロセスがいつ終了したかわかりません。
私のアプローチ
私の考えは、InitializeComponent() が終了した後、または LoadedEvent を処理した後に、接続された ViewModel (IsBusy=false) にブール値を設定できる各 UserControl に動作を接続することでした。このプロパティは、他の場所で BusyIndicator にバインドできます。
この動作を個々のユーザーコントロール/ビューにアタッチする必要があるため、このソリューションにはあまり満足していません。
この種の問題に対する別の解決策はありますか?GUI の読み込みプロセスをユーザーから隠したいと思っているのは私だけではないでしょうか?!
最近、このスレッドhttp://blogs.msdn.com/b/dwayneneed/archive/2007/04/26/multithreaded-ui-hostvisual.aspxに出会いました。しかし、これは2007年のものなので、私の目標を達成するためのより良い/より便利な方法があるかもしれません?