父窗口后面的ShowDialog()

Osz*_*kar 6 wpf showdialog

我使用ShowDialog()WindowStyle = WindowStyle.SingleBorderWindow;我的WPF(MVVM)应用程序打开一个模态窗口,但它让我浏览到使用Windows任务栏的父窗口(Windows 7).

我在这里找到了答案:WPF和ShowDialog()但它不适合我,因为我不需要"永远在线"工具窗口.

提前致谢

Mat*_*asG 10

尝试设置Owner对话框的属性.这应该工作.

Window dialog = new Window();
dialog.Owner = mainWindow;
dialog.ShowDialog();
Run Code Online (Sandbox Code Playgroud)

编辑: 我在使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这个主意很好。此时唯一的问题是在 ViewModel 中我没有 View 的信息。我尝试了“App.Current.MainWindow”,它可以工作,但不是最好的解决方案。也许我应该重新考虑 MVVM 模式的结构。 (2认同)

Gra*_*ush 5

我遇到了这个问题,但是当从视图模型打开窗口时,我没有对当前窗口的引用。为了解决这个问题,我使用了这段代码:

var myWindow = new MyWindowType();
myWindow.Owner = Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive);
Run Code Online (Sandbox Code Playgroud)

您可以使用:myWindow.Owner = Application.Current.MainWindow;

但是,如果您像这样打开三个窗口,则此方法会导致问题:

MainWindow
   |
   -----> ChildWindow1

               |
               ----->  ChildWindow2
Run Code Online (Sandbox Code Playgroud)

然后设置 ChildWindow2.Owner = Application.Current.MainWindow 会将窗口的所有者设置为其祖父窗口,而不是父窗口。