これを簡単に行うには2つの方法があります
Popup1つ目は、newの代わりにを使用することWindowです。たとえば、私はしばしばプロパティをViewModelforPopupContentとに入れ、コントロールIsPopupVisibleを表示したいときはいつでもそれらの値を設定します。Popupたとえば、ShowAboutPopuprelayコマンドは次のように実行されます。
void ShowAboutPopup()
{
PopupContent = new AboutViewModel();
IsPopupVisible = true;
}
Popupオブジェクトまたはカスタムを使用して表示できますUserControl。私は自分のカスタムポップアップUserControlを使用することを好みます。これは通常、次のようになります。
<Window>
<Canvas x:Name="RootPanel">
<SomePanel>
<!-- Regular content goes here -->
</SomePanel>
<local:PopupPanel Content="{Binding PopupContent}"
local:PopupPanel.IsPopupVisible="{Binding IsPopupVisible}"
local:PopupPanel.PopupParent="{Binding ElementName=RootPanel}" />
</Canvas>
</Window>
PopupContentプロパティは(ViewModelなどAboutViewModel)であり、DataTemplatesWPFに特定ViewModelsの特定の描画を指示するために使用されますViews
<Window.Resources>
<DataTemplate DataType="{x:Type local:AboutViewModel}">
<local:AboutView />
</DataTemplate>
</Window.Resources>
もう1つの方法はApplicationViewModel、起動時に実行されるようなものを用意し、開いているウィンドウを含むアプリケーション全体の状態を管理する方法です。
通常、私は現在のページを表示するためにApplicationViewを含むシングルを持っていることを好みますContentControl
<Window>
<ContentControl Content="{Binding CurrentViewModel}" />
</Window>
ただし、複数のウィンドウを管理するためにも使用できます。複数のオブジェクトを管理するために使用する場合は、一部のビュー固有のオブジェクトにアクセスする必要があるため、これWindowは純粋ではないことに注意してViewModelください。UIオブジェクトを参照することは、すべきことではありViewModelません。たとえば、メッセージの受信をサブスクライブし、ShowWindowそれらのメッセージを受信すると、指定されたビューを作成して表示し、場合によっては現在のウィンドウも非表示にします。
個人的には、複数のウィンドウはできるだけ避けようとしています。私の通常の方法は、任意のページの一貫したアプリケーションオブジェクトを含む単一のビューと、ContentControl変更される動的コンテンツを含むことです。興味があれば、ブログにこのナビゲーションスタイルを使用した例があります。