Form.Close()也正在关闭其他表单(对话框)

时间:2016-06-12 15:17:00

标签: c# forms winforms

我有一个简单的winforms应用程序。应用程序从MainForm开始,它始终隐藏。 MainForm打开另一个名为Notification(.Show)的表单,该表单在10秒后关闭。因此,如果MainForm打开一个对话框表单(.ShowDialog)而Notification仍处于打开状态,那么如果Notification命中10秒并关闭,则打开的对话框也会关闭。

通知表单和对话框表单都有TopMost = True

一个例子:

简短的例子: 即使我的应用程序只执行此操作,OtherDialogForm也会关闭:

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
        new Notification("Title", "Content").Show(); // closes itself after 10 seconds
        new OtherDialogForm().ShowDialog(); // being closed by form above (not wanted)
    }
}

更长的例子: MainForm.cs

public partial class MainForm : Form
{
    protected override void SetVisibleCore(bool value)
    {
        base.SetVisibleCore(false);
    }

    public MainForm() 
    {
        CreateNotification();
    }

    public void CreateNotification()
    {
        new Notification.Show();
    }

    // triggered while Notification (from above) is still open
    private async void TriggeredByHotkey()
    {
        using (OtherDialogForm dialog = new OtherDialogForm())
        {
            dialog.ShowDialog();
            // if DialogResult == ...
        }
    }
}

Notification.cs

public partial class Notification : Form
{
    Timer timer;

    public Notification()
    {
        // sets timer tick to 10 seconds,
        // then calls void with this.Close()
    }

    // not sure if I really need this, but the problem is still there without
    protected override CreateParams CreateParams
    {
        get
        {
            var cp = base.CreateParams;
            cp.ExStyle |= 8;  // Turn on WS_EX_TOPMOST
            return cp;
        }
    }
}

我真的不知道为什么对话框会与Notification一起关闭。

2 个答案:

答案 0 :(得分:2)

您可以隐藏通知表单而不是关闭它,因为它只是一个您不需要关闭它的通知,您可以将它保留在后台并在需要时显示它。 来自msdn:https://msdn.microsoft.com/en-us/library/c7ykbedk(v=vs.110).aspx

  

此版本的ShowDialog方法未指定表单或控件作为其所有者。调用此版本时,当前活动窗口将成为对话框的所有者。如果要指定特定所有者,请使用此方法的其他版本。

因此,如果您使用ShowDialog并且Notification表单成为另一个dialig表单的父级,则它们将在关闭通知表单时关闭

答案 1 :(得分:0)

如果您从通知表单中触发TriggeredByHotkey方法。这种方法只会在你的呼叫者活着时才会运行。特别是如果您使用using提供对话框。

在方法结束时,using引用的变量调用它自己的Dispose来关闭表单。