如何阻止对话窗口隐藏

时间:2012-05-31 07:56:43

标签: c# wpf modal-dialog

如果我创建一个派生自System.Windows.Window的类并使用ShowDialog显示它,它会按预期显示在主窗口上方,并且主窗口被禁用。 但是可以将两个窗口放在其他应用程序之后,然后将主窗口拉回来。这只留下一个似乎已经崩溃的窗口,并且可能令人困惑。

如果显示主窗口,是否可以确保始终显示对话框窗口? MessageBox.Show对话框没有这样的问题

更新

测试对话框定义为

public partial class MyDialog : Window
{
    public MyDialog()
    {
        InitializeComponent();
    }
}

并使用

进行调用
    MyDialog d = new MyDialog();
    d.ShowDialog();

3 个答案:

答案 0 :(得分:7)

您必须设置所有者属性。

MyDialog d = new MyDialog();
d.Owner = Application.Current.MainWindow;//or your owning window
d.ShowDialog();

答案 1 :(得分:1)

要确保在显示主窗口时始终显示对话框窗口,请根据主要可见性向主窗体可见性更改事件添加处理程序以将TopMost true或false设置为子窗体

ChildForm frmDLg = null;
public MainForm()
{
    this.VisibleChanged += MainFrmVisibleChanged;
}

private void LoadDialogForm()
{
    try {
        if (frmDLg == null || frmDLg.IsDisposed) {
            frmDLg = new ChildForm();
        }
        frmDLg.ShowDialog();
    } catch (Exception ex) {
        //Handle exception
    }
}

private void MainFrmVisibleChanged(object sender, System.EventArgs e)
{
    if (frmDLg != null && !frmDLg.IsDisposed) {
        frmDLg.TopMost = this.Visible;
    }
}

<强>更新

public override bool Visible
        {
            get
            {
                return base.Text;
            }
            set
            {
                base.Text = value;
                // Insert my code
                if (frmDLg != null && !frmDLg.IsDisposed)
                {
                    frmDLg.TopMost = this.Visible;
                }
            }
        }

我能想到的最后一种方法是使用带有user32 dll getforegroundwindow的计时器来检查主表单是否可见。

答案 2 :(得分:1)

此代码应该可以随意使用

public MainWindow()
    {
        InitializeComponent();

        this.Activated += new EventHandler(MainWindow_Activated);
    }

    void MainWindow_Activated(object sender, EventArgs e)
    {
        if (m == null)
            return;

        m.Activate();
    }


    private void button1_Click(object sender, RoutedEventArgs e)
    {
        m = new MyDialog();
        m.ShowDialog();
    }
    MyDialog m;