.net 如何在WPF中创建模态对话框?

.net 如何在WPF中创建模态对话框?,.net,wpf,dialog,modal-dialog,.net,Wpf,Dialog,Modal Dialog,如果我有一个Xaml窗口,如何将其作为子窗口打开,然后让父窗口等待子窗口关闭,然后再继续执行父窗口?是否尝试使用该方法显示窗口 不要忘记将对话框窗口上的设置为主窗口。这将避免在Alt+Tab等操作时出现奇怪的行为。是否尝试使用该方法显示窗口 不要忘记将对话框窗口上的设置为主窗口。这将避免Alt+Tabbing等操作时出现奇怪的行为。给定一个窗口对象myWindow,myWindow.Show()将以无模式打开它,myWindow.ShowDialog()将以模式打开它。然而,据我记忆所及,即使是

如果我有一个Xaml窗口,如何将其作为子窗口打开,然后让父窗口等待子窗口关闭,然后再继续执行父窗口?

是否尝试使用该方法显示窗口


不要忘记将对话框窗口上的设置为主窗口。这将避免在Alt+Tab等操作时出现奇怪的行为。

是否尝试使用该方法显示窗口


不要忘记将对话框窗口上的设置为主窗口。这将避免Alt+Tabbing等操作时出现奇怪的行为。

给定一个窗口对象myWindow,myWindow.Show()将以无模式打开它,myWindow.ShowDialog()将以模式打开它。然而,据我记忆所及,即使是后者也不会阻止。给定一个窗口对象myWindow,myWindow.Show()将以无模式方式打开它,myWindow.ShowDialog()将以模式方式打开它。然而,据我记忆,即使是后者也不会阻塞。

Window.Show将显示窗口,并继续执行——这是一个非阻塞调用

ShowDialog将阻止调用线程(类似于[1]),并显示对话框。它还将阻止与父窗口/所有者窗口的交互。当对话框被取消时(无论出于何种原因),ShowDialog将返回给调用者,并允许您访问DialogResult(如果需要)


[1] 它将通过将调度程序帧推到WPF调度程序上来保持调度程序的泵送。这将导致消息泵继续泵送。

Window.Show将显示窗口,并继续执行——这是一个非阻塞调用

ShowDialog将阻止调用线程(类似于[1]),并显示对话框。它还将阻止与父窗口/所有者窗口的交互。当对话框被取消时(无论出于何种原因),ShowDialog将返回给调用者,并允许您访问DialogResult(如果需要)


[1] 它将通过将调度程序帧推到WPF调度程序上来保持调度程序的泵送。这将导致消息泵持续泵送。

这些答案中有很多都过于简单,如果有人开始使用WPF,他们可能不知道所有的“细节”,因为这比仅仅告诉某人“使用
.ShowDialog()
!”要复杂得多。但这正是您想要使用的方法(而不是
.Show()
),以阻止底层窗口的使用,并阻止代码继续,直到模式窗口关闭

首先,您需要2个WPF窗口。(一方将呼叫另一方。)

从第一个窗口开始,我们假设它被称为MainWindow.xaml,在其代码背后将是:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}
然后将按钮添加到XAML:

<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />
在该函数中,必须使用其页面类指定另一个页面。假设您将另一个页面命名为“ModalWindow”,这样它就成为了它的页面类,您将如何实例化(调用)它:

假设您有一个需要在模态对话框上设置的值。在
ModalWindow
XAML中创建文本框和按钮:

<StackPanel Orientation="Horizontal">
    <TextBox Name="txtSomeBox" />
    <Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" /> 
</StackPanel>
然后,在执行
.ShowDialog()
语句后,可以获取该值并使用它:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();

    string valueFromModalTextBox = ModalWindow.myValue;
}

很多答案都过于简单,如果有人开始使用WPF,他们可能不知道所有的“细节”,因为这比仅仅告诉某人“使用
.ShowDialog()
!”要复杂得多。但这正是您想要使用的方法(而不是
.Show()
),以阻止底层窗口的使用,并阻止代码继续,直到模式窗口关闭

首先,您需要2个WPF窗口。(一方将呼叫另一方。)

从第一个窗口开始,我们假设它被称为MainWindow.xaml,在其代码背后将是:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}
然后将按钮添加到XAML:

<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />
在该函数中,必须使用其页面类指定另一个页面。假设您将另一个页面命名为“ModalWindow”,这样它就成为了它的页面类,您将如何实例化(调用)它:

假设您有一个需要在模态对话框上设置的值。在
ModalWindow
XAML中创建文本框和按钮:

<StackPanel Orientation="Horizontal">
    <TextBox Name="txtSomeBox" />
    <Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" /> 
</StackPanel>
然后,在执行
.ShowDialog()
语句后,可以获取该值并使用它:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
    ModalWindow modalWindow = new ModalWindow();
    modalWindow.ShowDialog();

    string valueFromModalTextBox = ModalWindow.myValue;
}

我相信它会阻塞。myWindow.Show()之后的代码在myWindow调用Close()之后才会执行。您和@AlexBaranosky都是正确的:ShowDialog在模式关闭之前不会返回,因此它会阻止当前正在执行的dispatcher操作。但是
ShowDialog
本身有效地调用了
Dispatcher.Run()
,因此Dispatcher继续执行操作,实际上保持了UI的响应性。我相信它会阻塞。myWindow.Show()之后的代码在myWindow调用Close()之后才会执行。您和@AlexBaranosky都是正确的:ShowDialog在模式关闭之前不会返回,因此它会阻止当前正在执行的dispatcher操作。但是
ShowDialog
本身有效地调用了
Dispatcher.Run()
,因此Dispatcher继续执行操作,实际上保持了UI的响应。请详细解释一下?我正在研究一个类似的问题,其中我有一个测试进程正在运行,但警告消息可以作为模式对话框弹出,但我不想阻止执行。请详细解释一下?我正在看一个类似的问题,我有一个测试进程正在运行,但警告消息可以作为模态对话框弹出,但我不想阻止执行。在这里共享,因为它可能帮助从谷歌漫游到这里的人。在这里共享,因为它可能帮助从谷歌漫游到这里的人。