9

ShowDialog()WPF (MVVM) アプリケーションでモーダル ウィンドウを開くためにwithを使用しWindowStyle = WindowStyle.SingleBorderWindow;ていますが、Windows タスクバー (Windows 7) を使用して親ウィンドウに移動できます。

私はここで答えを見つけました: WPF and ShowDialog()しかし、「常に一番上にある」ツールウィンドウは必要ないため、私には適していません。

前もって感謝します

4

7 に答える 7

12

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
    }
}
于 2012-03-24T22:05:22.970 に答える
1

親ウィンドウが子ウィンドウを作成 (および表示) する場合、そこに所有者を設定する必要があります。

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>
于 2012-04-06T15:54:47.143 に答える
1

MVVM パターンを使用する理由の多くは、対話ロジックを単体テストできるようにするためです。このため、ViewModel から直接ウィンドウを開かないでください。そうしないと、単体テストの途中でダイアログが表示されます。

代わりに、ビューが処理するイベントを発生させ、ダイアログを開く必要があります。たとえば、インタラクション リクエストに関する次の記事を参照してください: https://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec12

于 2016-05-02T21:50:35.303 に答える
0

「ShowInTaskbar」を追加して false に設定します。

于 2012-03-25T02:13:30.257 に答える