【问题标题】:How to prevent minimizing parent window from closing child window如何防止最小化父窗口关闭子窗口
【发布时间】:2020-06-26 02:55:50
【问题描述】:

早安,

我想检查是否有人可以帮助解决我遇到的以下问题。我有一个使用ShowDialog(this) 显示的子表单,并且我正在注册Resize 事件,以便我可以与孩子一起更改父母的状态。问题是当父窗体最小化时,子窗体关闭。我已经确定父级中的WindowState = FormWindowState.Minimized 调用导致using 语句通过ShowDialog(IWin32Window) 的阻塞调用,但我不明白当只有子级最小化时(然后父级无法获得焦点) ,阻塞调用没有通过。我该如何解决这种行为?最好不要持有对子窗口的引用,并在每次父的WindowState 更改时检查它。

我的代码:

private void StockTakeHistoryMenu_Click(object sender, EventArgs e)
{
    using (StockTakeWindow window = new StockTakeWindow())
    {
        window.Resize += this.ChildStateChanging;
        window.ShowDialog(this);
        window.Resize -= this.ChildStateChanging;
    }
}

private void ChildStateChanging(object sender, EventArgs e)
{
    switch ((sender as Form).WindowState)
    {
        case FormWindowState.Normal:
            this.WindowState = FormWindowState.Normal;
            break;

        case FormWindowState.Minimized:
            this.WindowState = FormWindowState.Minimized;
            break;

        case FormWindowState.Maximized:
            this.WindowState = FormWindowState.Maximized;
            break;
    }
}

【问题讨论】:

  • 不能阻止child关闭,必须阻止parent最小化。用户无法执行此操作,父级已禁用,因此您必须在代码中找到执行此操作的语句。也许是在 ChildStateChanging() 中,你必须确保子窗口不允许用户最小化它。将其 MinimizeBox 属性设置为 False。
  • 并考虑是否真的需要 ShowDialog()。您不使用它的返回值,不使用 using 并且不检索对话框属性,因此它看起来不像它。您更喜欢使用 Show(),通过 FormClosing 事件知道窗口即将关闭。
  • @HansPassant 我不使用 DialogResult,是的,并且 using 和 ChildStateChanging 是根据需要实现的。事情是当孩子最小化时我想最小化父母。当用户最小化孩子时,我想允许父母也被最小化,这样即使父母被禁用,他们也可以在表单后面工作,因为当 ShowDialog 仍处于活动状态时,您无法单击最小化

标签: c# winforms desktop-application


【解决方案1】:

你可以用这个:

private void ChildStateChanging(object sender, EventArgs e)
{
    this.Show();

    switch ((sender as Form).WindowState)
    {
        case FormWindowState.Normal:
            this.WindowState = FormWindowState.Normal;
            break;

        case FormWindowState.Minimized:
            //this.WindowState = FormWindowState.Minimized;
            this.Hide();
            break;

        case FormWindowState.Maximized:
            this.WindowState = FormWindowState.Maximized;
            break;
    }
}

我先打电话给this.Show();ChildStateChanging,我写的是this.Hide()而不是this.WindowState = FormWindowState.Minimized;

【讨论】:

  • 同样,隐藏对话框的所有者也会强制关闭。
  • @Fred 当我开始阅读@Hans Passant 关于这个问题的 cmets 时,我也得出结论,这将是唯一的解决方案。它就像一个魅力,除了当父隐藏时,任务栏图标消失,我需要找到悬停在左下角的孩子以在父显示时恢复图标。我已经尝试在提到的处理程序中设置和取消设置孩子的ShowInTaskbar,但这解决了窗口完全消失并且在 ALT+Tab 中没有任何任务栏图标的问题。必须杀死 exe 或停止调试
  • @Fred 然而我看到Show(IWin32Window)ShowDialog(IWin32Window) 在最基本和需要(也是使用的原因)方式上完全不同。当 Show 被调用时,它根本不会居中父级,而 ShowDialog 会这样做,并且 ShowDialog 会在显示子级时阻止在父级上工作。这是调用 ShowDialog 的预期结果
【解决方案2】:

看起来我可以帮助你,因为我目前正在设计一个 c# win 表单。只是一步一步地描述它,我无法理解你在问什么。 问题的解决方案(如何防止最小化父窗口关闭子窗口)是您需要使用自定义用户控件,并且当您单击位于自定义用户控件上的按钮时,只需在按钮单击事件中编写代码,例如 this.hide()。这将隐藏子控件,而不是父控件。

【讨论】:

    猜你喜欢
    • 2013-10-09
    • 1970-01-01
    • 2019-09-30
    • 2021-12-31
    • 2014-03-17
    • 1970-01-01
    • 2019-10-06
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多