2016-06-12 27 views
1

我有一個簡單的winforms應用程序。應用程序始終始終隱藏着MainForm。 MainForm打開另一個稱爲Notification(.Show)的表單,該表單在10秒後關閉。因此,如果MainForm在Notification仍處於打開狀態時打開對話框窗體(.ShowDialog),則當Notification點擊10秒並關閉時,打開的對話框也會關閉。Form.Close()也關閉其他窗體(對話框)

通知形式以及對話形式具有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; 
     } 
    } 
} 

我真的不知道爲什麼對話與通知一起關閉。

+0

一個對話框,需要一個所有者窗口被關閉。如果你沒有提供一個ShowDialog(所有者)重載或所有者屬性,那麼它自己去尋找一個。它將選擇由同一個線程擁有的活動窗口。如果關閉或隱藏該窗口,那麼該對話框也是歷史記錄。注意它不會是MainForm,即使你在其構造函數中調用了ShowDialog(),它仍然不活躍。否則通過使用ShowDialog(this)瑣碎修復。 –

回答

1

您可以隱藏通知的形式,而不是關閉它,因爲只是你並不真的需要將其關閉的通知,你可以把它的背景,並顯示它在需要時。 從MSDN:https://msdn.microsoft.com/en-us/library/c7ykbedk(v=vs.110).aspx

此版本ShowDialog方法沒有指定形式或控制作爲其所有者的。當這個版本被調用時,當前活動的窗口成爲對話框的所有者。如果要指定特定的所有者,請使用此方法的其他版本。

所以,如果你正在使用的ShowDialog和通知的形式成爲其他dialig形式的家長,他們都將在收盤申報書

+0

要指定它,這個應用程序是一個上傳屏幕截圖的客戶端。因此,每次上傳圖片時都會顯示帶有鏈接的通知,但這並不是唯一需要通知的情況。在筆記本電腦上,例如,這個應用程序可能會運行幾天,所以我不知道在後臺保留這麼多表單是否是一種好的做法,而且我也在努力降低內存使用率。 – Vaza

+0

編輯完成後:現在可以使用了! .ShowDialog(這個)解決了我在尋找幾天的問題。謝謝! – Vaza

+0

嘗試使用。ShowDialog(this),而不是沒有參數的超載,它應該可以工作,因爲您將使主窗體成爲對話框的父窗口 – meJustAndrew

0

如果你正在引發從​​通知的形式TriggeredByHotkey方法。該方法只會在您的調用者處於活動狀態時運行。特別是如果您正在使用using重新使用對話框。

在該方法中,提到變量的末尾由using,稱這是自己的Dispose將關閉表單。

+0

TriggerByHotkey在MainForm內被觸發。即使我只用一種方法在'using'中調用'Notification.Show()'和'OtherDialogForm.ShowDialog()',對話框仍然在10秒後關閉。 – Vaza

相關問題