【问题标题】:How can I stop a dialog window from getting hidden如何阻止对话框窗口隐藏
【发布时间】:2012-05-31 07:56:42
【问题描述】:

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

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

更新:

一个测试对话框被定义为

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

并调用使用

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

【问题讨论】:

  • 你使用 Form::ShowDialog(IWin32Window) 方法吗?带有所有者窗口的对话框应如您所愿。
  • 我没有使用 Forms,它是一个 System.Windows.Window,并且 ShowDialog 不带任何参数

标签: c# wpf modal-dialog


【解决方案1】:

你必须设置 Owner 属性。

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

【讨论】:

  • 我在我的 WPF 应用程序中使用PopupWindowAction。将 owner 设置为 当前主窗口 是获取我们从 Windows MessageBox 中了解的描述行为的关键。 (谢谢,我已经搜索了一个小时......!)
【解决方案2】:

为确保在显示主窗口时始终显示对话框窗口,请将处理程序添加到主窗体可见性更改事件,以根据主窗体将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 的计时器来检查主窗体是否可见。

【讨论】:

  • 我使用的是 System.Windows.Window 而不是窗体,并且它没有 VisibleChanged 事件属性。抱歉没有说清楚
  • 对不起,我在 dot net 3.5 中找不到 System.Windows.Window,如果你能找到 Window.Visible 属性,请尝试覆盖它,而不是我的MainFrmVisibleChanged 使用 Visible 集属性检查更新在那里
  • 详情在msdn.microsoft.com/en-us/library/system.windows.window.aspx 感谢您的建议,但设置所有者解决了我的情况下的问题。
【解决方案3】:

此代码应该可以按您的意愿工作

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2017-01-02
    • 1970-01-01
    相关资源
    最近更新 更多