2011-08-08 35 views
1

我想達到像在this文章中的效果一樣,但對於Windows窗體,它甚至可能沒有託管控件在不同的窗體上?仿真WinForms的ShowDialog用戶控件

編輯 我更感興趣的是在文章中實現控件的確切行爲,顯示了窗體上的控件並阻止了調用函數,但沒有爲此使用其他窗體。

回答

3

您可以創建兩個按鈕的用戶控件和消息的標籤,然後將其可見性爲false在構造函數中:

public MyDialog() 
    { 
     InitializeComponent(); 
     Visible = false; 
    } 

然後添加三個變量來控制:

Form _parent; 
    bool _result; 
    bool _clicked = false; 

父窗體將是您的控件包含在窗體中,並且必須在使用控件之前設置,因爲它必須知道必須禁用的內容。

public void SetParent(Form f) 
    { 
     _parent = f; 
    } 

_result將包含對話的結果,並_clicked將被用來確定何時關閉對話框。什麼必須做,當你表現出你的對話是:

  1. 設置標籤
  2. 禁用窗體(但不是對話框)
  3. 讓用戶點擊一個對話框可見
  4. 等待按鈕的
  5. 隱藏對話框
  6. 重新啓用父窗體
  7. 返回結果

所以,你可以添加這個方法來啓用/禁用父窗體:

private void ParentEnabled(bool aBool) 
    { 
     if (_parent == null) 
      return; 
     foreach (Control c in _parent.Controls) 
      if (c != this) 
       c.Enabled = aBool; 
    } 

,並在ShowDialog方法使用它:

public bool ShowDialog(string msg) 
    { 
     if (_parent == null) 
      return false; 
     // set the label 
     msgLbl.Text = msg; 
     // disable the form 
     ParentEnabled(false); 
     // make the dialog visible 
     Visible = true; 
     // wait for the user to click a button 
     _clicked = false; 
     while (!_clicked) 
     { 
      Thread.Sleep(20); 
      Application.DoEvents(); 
     } 
     // reenable the form 
     ParentEnabled(true); 
     // hide the dialog 
     Visible = false; 
     // return the result 
     return _result; 
    } 

明顯的按鈕有責任來設置_result和_clicked變量:

private void okBtn_Click(object sender, EventArgs e) 
    { 
     _result = true; 
     _clicked = true; 
    } 
    private void cancelBtn_Click(object sender, EventArgs e) 
    { 
     _result = false; 
     _clicked = true; 
    } 
+0

不好。 (!點擊)是醜陋的。這是應該關閉'對話框'的按鈕。 –

+0

好的,你不喜歡它(我也沒有),但是如果你點擊了一個按鈕後你會如何返回ShowDialog? –

+0

不確定是否可能。這就是爲什麼它應該是ShowDialog()會顯示的透明表單。 –

0

如何創建透明窗體,在中間包含不透明形狀的文本(無論你喜歡什麼)。然後在運行時,您將調整此窗體的大小,使其與要顯示它的窗口具有相同的大小,並將其放置以覆蓋它。