これを簡単に行うには2つの方法があります
Popup
1つ目は、newの代わりにを使用することWindow
です。たとえば、私はしばしばプロパティをViewModel
forPopupContent
とに入れ、コントロールIsPopupVisible
を表示したいときはいつでもそれらの値を設定します。Popup
たとえば、ShowAboutPopup
relayコマンドは次のように実行されます。
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
)であり、DataTemplates
WPFに特定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
変更される動的コンテンツを含むことです。興味があれば、ブログにこのナビゲーションスタイルを使用した例があります。