2010-07-27 74 views
5

我想防止在任何對話框模態時激活我的winforms應用程序中的所有其他窗體。這就是Outlook的運作方式 - 打開兩封新郵件,從一封郵件中打開地址簿,並且無法使用任務欄或單擊郵件窗口來激活其他郵件。我如何在winforms應用程序中執行此操作(請注意,設置所有權不起作用)?當模態對話框處於活動狀態時,阻止任務欄激活非模態窗體

下面的示例應用程序。

using System.Drawing; 
using System.Windows.Forms; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
     } 
    } 

    public class MainForm : Form 
    { 
     public MainForm() 
     { 
     Text = "Main Form"; 
     var button = new Button{Text = "New form"}; 
     button.Click += (sender, args) => new Form2().Show(); 
     //button.Click += (sender, args) => { var form = new Form2(); AddOwnedForm(form); form.Show(); }; 
     Controls.Add(button); 
     button.Location = new Point(20, 20); 
     } 
    } 

    public class Form2 : Form 
    { 
     public Form2() 
     { 
     Text = "Form 2"; 
     var button = new Button{Text = "New modal form"}; 
     button.Click += (sender, args) => new Form{Text = "Modal Dialog", ShowInTaskbar = false}.ShowDialog(); 
     Controls.Add(button); 
     button.Location = new Point(20, 20); 
     } 
    } 
} 

若要重現行爲,運行應用程序,打開兩個窗體2實例,然後從打開的二審模態對話框。然後使用任務欄激活第一個Form2實例,並將其顯示在模態對話框的上方。

更新:這個重複與WPF Windows也。

更新:從漢斯的反饋,這似乎是一個錯誤,我已經報告給connect.microsoft.com here

回答

2

我是repro,Win7。除了使這些表單擁有外,我沒有看到明顯的解決方法,因此它們不需要任務欄按鈕。 Windows窗口管理器允許禁用的窗口變爲活動狀態很奇怪。這不會經常進行測試,非常不尋常的是讓一個應用程序需要很多任務欄按鈕。

+0

感謝繁殖漢斯。是的,這將解決問題,但該應用程序旨在讓用戶打開數據表單,就像Outlook允許您打開電子郵件/約會/等。 – 2010-07-27 20:50:35

+0

您可以嘗試connect.microsoft.com報告問題。他們認真對待它需要奇蹟。 – 2010-07-27 21:22:10

相關問題