9

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

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

更新:

测试对话框定义为

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

并调用使用

    MyDialog d = new MyDialog();
    d.ShowDialog();
4

3 回答 3

8

您必须设置 Owner 属性。

MyDialog d = new MyDialog();
d.Owner = Application.Current.MainWindow;//or your owning window
d.ShowDialog();
于 2012-05-31T08:27:06.757 回答
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 的计时器来检查主窗体是否可见。

于 2012-05-31T08:10:45.600 回答
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;
于 2012-05-31T08:40:18.963 回答