我想達到像在this文章中的效果一樣,但對於Windows窗體,它甚至可能沒有託管控件在不同的窗體上?仿真WinForms的ShowDialog用戶控件
編輯 我更感興趣的是在文章中實現控件的確切行爲,顯示了窗體上的控件並阻止了調用函數,但沒有爲此使用其他窗體。
我想達到像在this文章中的效果一樣,但對於Windows窗體,它甚至可能沒有託管控件在不同的窗體上?仿真WinForms的ShowDialog用戶控件
編輯 我更感興趣的是在文章中實現控件的確切行爲,顯示了窗體上的控件並阻止了調用函數,但沒有爲此使用其他窗體。
您可以創建兩個按鈕的用戶控件和消息的標籤,然後將其可見性爲false在構造函數中:
public MyDialog()
{
InitializeComponent();
Visible = false;
}
然後添加三個變量來控制:
Form _parent;
bool _result;
bool _clicked = false;
父窗體將是您的控件包含在窗體中,並且必須在使用控件之前設置,因爲它必須知道必須禁用的內容。
public void SetParent(Form f)
{
_parent = f;
}
_result將包含對話的結果,並_clicked將被用來確定何時關閉對話框。什麼必須做,當你表現出你的對話是:
所以,你可以添加這個方法來啓用/禁用父窗體:
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;
}
如何創建透明窗體,在中間包含不透明形狀的文本(無論你喜歡什麼)。然後在運行時,您將調整此窗體的大小,使其與要顯示它的窗口具有相同的大小,並將其放置以覆蓋它。
不好。 (!點擊)是醜陋的。這是應該關閉'對話框'的按鈕。 –
好的,你不喜歡它(我也沒有),但是如果你點擊了一個按鈕後你會如何返回ShowDialog? –
不確定是否可能。這就是爲什麼它應該是ShowDialog()會顯示的透明表單。 –