2012-01-02 52 views
1

我試圖讓模板窗體最小化時所有者窗體最小化。但是,當我最小化模態形式 - 它完全消失。 ( - 我可以點擊店主表格。)爲什麼模態形式在最小化時完全消失?

我該如何解決?

我:

public partial class Form1 : Form 
{ 
    Form2 frm2 = new Form2(); 

    public Form1() 
    { 
     InitializeComponent(); 
     frm2.Owner = this; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     frm2.ShowDialog(); 
    } 
} 

和:

class Form2 : Form 
{ 
    Form1 frm1; 
    FormWindowState ws = new FormWindowState(); 

    public Form2() 
    { 
     SizeChanged += new EventHandler(Form2_SizeChanged); 
    } 

    void Form2_SizeChanged(object sender, EventArgs e) 
    { 
     frm1 = (Form1)Owner; 
     if (WindowState == FormWindowState.Minimized) 
     { 
      ws = frm1.WindowState; 
      frm1.WindowState = FormWindowState.Minimized; 
     } 
     else frm1.WindowState = ws; 
    } 

} 

(雖然試圖此,我也碰到了這一點:Modal form doesn't appear in tray until minimized and owner-form is clicked once. How do I make it appear?

+0

「Form2」的'ShowInTaskBar'設置爲true嗎? – 2012-01-02 20:36:31

+0

@competent_tech我只是試過。沒有什麼區別。但是,謝謝。 – ispiro 2012-01-02 20:47:44

回答

0

添加:

Show(); 

在窗體2的事件處理程序的結束。

0

形式有一個屬性ShowInTaskbar。如果它設置爲false,那麼即使最小化,表單也不會出現在任務欄上。

+0

我假設你正在回答我的其他問題。我剛剛嘗試過。沒有什麼區別。但是,謝謝。 – ispiro 2012-01-02 20:50:14

1

我不記得每一個需要這麼多的代碼才能讓模態窗口工作。我擔心你的評論'我可以點擊所有者表單',這導致我相信表單被正確設置爲模式。通過定義,在用戶控制返回到所有者表單之前,必須處理模式表單。 Minimizinfg模式形式並不構成與模式形式的「交易」。

以下是我過去使用的一些代碼。注意:在ShowDialog中傳遞所有者作爲參數可以建立所有權關係。雖然我懷疑你的代碼有效,但我沒有這樣用過。另外,當我這樣做時,我沒有在模態窗體中放置任何特殊代碼,並且也禁用了窗體右上角的所有按鈕;從而確保用戶不能在我提供的任何按鈕之外關閉,最小化或最大化模態表單。

public partial class Form1 : Form 
{ 
    Form2 frm2 = new Form2(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     frm2.ShowDialog(this); 
    } 
} 

我希望這會有所幫助。

+0

謝謝。 (歡迎來到StackOverflow。)但是如果用戶想看看我的應用程序背後發生了什麼?他需要能夠最小化我的_entire_應用程序。 (並且感謝'ShowDialog(this)'。) – ispiro 2012-01-02 21:17:55

+0

噢,我做了一個假設,這個(模態窗體)是一個簡單的對話框或者是在主窗體上臨時打開的pref屏幕。這個想法是模態形式是臨時的。主要的應用程序表單不應該是模態的。 – 2012-01-02 21:20:15

+0

不,你說得對。模態形式_is_是主表單上的臨時表單。 (而且這是隱藏的桌面,除非_all_被最小化)但無論如何,我看到我所尋找的不是一個(簡單的)選項。順便說一句,你的'ShowDialog(this)'解決了我的另一個問題。再次感謝。 – ispiro 2012-01-02 21:59:53

3

這是設計。作爲模式合約的一部分,顯示對話框會禁用應用程序中的所有其他窗口。當用戶最小化對話窗口時,用戶可以訪問的窗口沒有了。使應用程序無法使用。 Winforms確保在最小化時自動關閉對話框不會發生。

顯然你會想要防止這種情況發生。將MinimizeBox屬性設置爲false。 MaximizeBox屬性也應該設置爲false,使兩個按鈕從窗口標題中消失。留下HelpButton btw的空間。

+0

a)感謝您的所有反饋。 b)但我不明白這個推理。如果用戶想要讓我的應用程序不能看到另一個應用程序,他希望我的整個應用程序不受影響。爲什麼它不可用?他只需點擊任務欄即可重新獲取它。 – ispiro 2012-01-02 21:00:32

+0

我知道當我使用SyncToy並且它在後臺工作時,我最小化Sync的模式形式,並且我受到無法最小化的所有者形式的困擾。 – ispiro 2012-01-02 21:01:05

+0

好吧,避免使用破損的應用程序作爲例子。在Visual Studio中,使用工具+選項作爲一個很好的例子。注意對話框的窗口標題,儘量減少VS.在前臺放置另一個應用程序的窗口當然沒有問題。 – 2012-01-02 21:16:53

0

我也有要求,當最小化對話框形式時,它應該最小化應用程序,當恢復應用程序時,它應該再次顯示對話框。下面是我所做的:

MainForm.cs

public partial class MainForm : Form 
{ 
    public MainForm() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Form2.Show(this, "Testing 123"); 
    } 
} 

窗體2。cs

public partial class Form2 : Form 
{ 
    bool isMinimized; 

    private Form2() 
    { 
     InitializeComponent(); 
     ShowInTaskbar = false; 
    } 

    private void Form2_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     if (Owner != null) 
     { 
      Owner.Enabled = true; 
     } 
    } 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     MinimizeBox = Owner != null; 
     if (Owner != null) 
     { 
      Owner.Enabled = false; 
     } 
    } 

    private void Form2_SizeChanged(object sender, EventArgs e) 
    { 
     if (Owner != null) 
     { 
      if (WindowState == FormWindowState.Minimized && Owner.WindowState != FormWindowState.Minimized) 
      { 
       Owner.Enabled = true; 
       Owner.WindowState = FormWindowState.Minimized; 
       isMinimized = true; 
      } 
      else if (isMinimized && Owner.WindowState != FormWindowState.Minimized) 
      { 
       Owner.Enabled = false; 
      } 
     } 
    } 

    public static void Show(Form owner, string message) 
    { 
     var form2 = new Form2(); 
     form2.label1.Text = message; 

     if (owner != null) 
      form2.Show(owner); 
     else 
      form2.ShowDialog(); 
    } 
} 
相關問題