[英]Make secondary modeless windows visible when main window activated
我有一個Winforms應用程序,其主窗體創建了多個輔助通知窗口。 這些輔助窗口沒有所有者並且是無模式的,因為我希望主窗體能夠位於它們之上。 它們也不會顯示在任務欄中(ShownInTaskbar = False)。
現在,如果將主窗口最小化(或在其頂部放置了另一個應用程序),然后單擊任務欄中的應用程序圖標,則我希望同時顯示所有輔助窗口(但主窗口位於頂部) (如果它們重疊)。 因此,我希望主窗口位於最頂部,輔助窗口位於其后,而其他任何應用程序都位於THEM之后。
為此,我在內存中保留了這些輔助窗口的列表。 我編寫了以下事件處理程序以顯示輔助窗口:
private void SmgWfMainForm_Activated(object sender, EventArgs e)
{
foreach(SecondaryWindow sw in _secondaryWindows)
{
sw.BringToFront();
}
this.BringToFront();
}
不幸的是,這不起作用。 發生的是對this.BringToFront()的最終調用導致Activated事件處理程序再次觸發,並且該處理程序不斷循環不斷地啟動。 因此,我永遠無法與主要表單進行互動。 如果我不打那個電話,則最后一個輔助窗口將成為焦點,如果單擊主窗體,則將觸發事件,並且輔助窗口再次位於主窗體的頂部,並且我遇到相同的問題。
關於如何解決此問題的任何想法? 除了this.BringToFront()之外,還有別的可以調用的東西嗎? 或者也許我可以監聽的另一個事件不會被this.BringToFront()觸發?
您可以使用布爾變量來防止重新進入:
private bool _activatingFromEvent = false;
protected override void OnActivated(EventArgs evt)
{
if(_activatingFromEvent)
{
// Don't call the event this time
_activatingFromEvent = false;
return;
}
base.OnActivated(evt);
}
private void SmgWfMainForm_Activated(object sender, EventArgs e)
{
if(_activatingFromEvent)
return;
_activatingFromEvent = true;
foreach(SecondaryWindow sw in _secondaryWindows)
{
sw.BringToFront();
}
this.BringToFront();
}
這將解決您的直接問題,而無需更改太多代碼。
編輯 :我現在看到您說您的表單不歸所有人所有,所以我想它們不是出於某種原因,所以請忽略其余的答案。 反正我會留在這里
進行所需操作的另一種方法是讓輔助表單被主表單“擁有”(當顯示它們時, 使用此重載將主表單傳遞給Show
方法,或者設置Owner
屬性 )。
但是,這有更多的含義,因此請謹慎使用:
如果適合您,最好擁有自己的表格
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.