ShowDialog()
WPF (MVVM) アプリケーションでモーダル ウィンドウを開くためにwithを使用しWindowStyle = WindowStyle.SingleBorderWindow;
ていますが、Windows タスクバー (Windows 7) を使用して親ウィンドウに移動できます。
私はここで答えを見つけました: WPF and ShowDialog()しかし、「常に一番上にある」ツールウィンドウは必要ないため、私には適していません。
前もって感謝します
ShowDialog()
WPF (MVVM) アプリケーションでモーダル ウィンドウを開くためにwithを使用しWindowStyle = WindowStyle.SingleBorderWindow;
ていますが、Windows タスクバー (Windows 7) を使用して親ウィンドウに移動できます。
私はここで答えを見つけました: WPF and ShowDialog()しかし、「常に一番上にある」ツールウィンドウは必要ないため、私には適していません。
前もって感謝します
Owner
ダイアログのプロパティを設定してみてください。それはうまくいくはずです。
Window dialog = new Window();
dialog.Owner = mainWindow;
dialog.ShowDialog();
編集: これをMVVMで使用すると、同様の問題が発生しました。これは、デリゲートを使用して解決できます。
public class MainWindowViewModel
{
public delegate void ShowDialogDelegate(string message);
public ShowDialogDelegate ShowDialogCallback;
public void Action()
{
// here you want to show the dialog
ShowDialogDelegate callback = ShowDialogCallback;
if(callback != null)
{
callback("Message");
}
}
}
public class MainWindow
{
public MainWindow()
{
// initialize the ViewModel
MainWindowViewModel viewModel = new MainWindowViewModel();
viewModel.ShowDialogCallback += ShowDialog;
DataContext = viewModel;
}
private void ShowDialog(string message)
{
// show the dialog
}
}
親ウィンドウが子ウィンドウを作成 (および表示) する場合、そこに所有者を設定する必要があります。
public partial class MainWindow : Window
{
private void openChild()
{
ChildWindow child = new ChildWindow ();
child.Owner = this; // "this" is the parent
child.ShowDialog();
}
}
さらに、すべての子に余分なタスクバーが必要ない場合は...
<Window x:Class="ChildWindow"
ShowInTaskbar="False" >
</Window>
MVVM パターンを使用する理由の多くは、対話ロジックを単体テストできるようにするためです。このため、ViewModel から直接ウィンドウを開かないでください。そうしないと、単体テストの途中でダイアログが表示されます。
代わりに、ビューが処理するイベントを発生させ、ダイアログを開く必要があります。たとえば、インタラクション リクエストに関する次の記事を参照してください: https://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec12
「ShowInTaskbar」を追加して false に設定します。