簡體   English   中英

激活主窗口后,使輔助無模式窗口可見

[英]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屬性 )。

但是,這有更多的含義,因此請謹慎使用:

  1. 如果您關閉主窗體,則擁有的窗體也將關閉
  2. 擁有的表單將始終顯示在所有者表單上
  3. 當您的所有者表單最小化時,所有其擁有的表單都會被隱藏(並且在恢復時會再次顯示)

如果適合您,最好擁有自己的表格

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM