winform 關閉form2的同時顯示form1
前言
水群的時候看到的一個高頻問題, 總是有很多人問, 所以就簡單寫寫......
問題描述
萌新在 form1 中點擊按鈕創建并且顯示(Show) form2, 同時 form1 隱藏(Hide)
然后在 form2 關閉的時候無法操作 form1 , 最終只能通過 vs 關閉程式
如果用了非除錯的話,估計就不會關了
現需要在 關閉 form2 的同時 顯示 創建 form2 的 form1
思路&解決方案(簡)
1.簡單粗暴
最簡單粗暴的做法就是在創建 form2 的同時通過建構式或者其他什么辦法將 form1 的參考傳遞給 form2, 然后在 form2 里面呼叫 form1.Show()
Form2.cs
private Form1 form1;
// 通過建構式傳遞form1
public Form2(Form1 form)
{
InitializeComponent();
form1 = form;
}
// 為 form2 的關閉事件系結 form1.Show() 方法
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
form1.Show();
}
Form1.cs
private void OpenForm2_Click(object sender, EventArgs e)
{
// 創建 form2 時傳遞 form1
var form2 = new Form2(this);
form2.Show();
Hide();
}
這樣寫基本上就可以實作上面的需求了, 如果form2可能會有多個創建者, 只需要將form2中保存的 Form1 改為 Form 即可
Form2.cs
private Form Creator;
// 通過建構式傳遞form1
public Form2(Form form)
{
InitializeComponent();
Creator = form;
}
// 為 form2 的關閉事件系結 form1.Show() 方法
private void Form2_FormClosed(object sender, FormClosedEventArgs e)
{
Creator.Show();
}
使用所有表單的基類 Form 可以簡化很多操作
2.使用內置事件
微軟的 Form 有一些內置的事件, 我們可以借用這些事件實作上述的需求
Form 表單關閉時會觸發 FormClosed 事件, 為該事件加個委托即可
Form1.cs
private void OpenForm2_Click(object sender, EventArgs e)
{
var form2 = new Form2();
// 如果只是需要實作上述的需求, 棄元即可
form2.FormClosed += (_, _) => Show();
form2.Show();
Hide();
}
Form2不需要做任何改動
比較麻煩的方法
3.自定義事件/委托
使用內置的事件可以滿足基本需求, 但如果需要傳遞資料給 From1, 可能就不大夠用了
這個時候可以自定義事件或者委托
Form2.cs
public Form4()
{
InitializeComponent();
}
// 傳一個 int 型別的值
public EventHandler<int> EventWithInt;
// 傳一個 DateTime 型別的值
public Action<DateTime> FuncWithTime;
private void ToggleEvent_Click(object sender, EventArgs e)
{
EventWithInt(sender, 233);
}
private void ToggleFunc_Click(object sender, EventArgs e)
{
FuncWithTime(DateTime.Now);
}
Form2 中定義了一個 事件 EventHandler<int> EventWithInt 和一個 委托 Action<DateTime> FuncWithTime , 分別在點擊按鈕的時候觸發
Form1.cs
private void OpenForm2_Click(object sender, EventArgs e)
{
var form2 = new Form2();
form2.EventWithInt += (_, num) => OpenForm2.Text = num.ToString();
form2.FuncWithTime += time => OpenForm2.Text = time.ToString();
form2.Show();
}
在 Form1 中創建 Form2 時系結對應委托, 在點擊 Form2 的按鈕時修改 Form1 中按鈕的 Text 屬性
4."多此一舉"的封裝
偶爾可能會出現 Form1 創建 Form2 , 然后 Form2 又創建了 Form3 ,然后 Form3 ......
以此類推, 可能到了 Form233 的時候需要 Form1.Show() , 在這種情況下上述的幾個解決方案可能都還能用, 但是實作起來太過麻煩, 或者會對路徑上的所有 Form 產生很大的侵入
所以在此提供一個"非常簡單"的思路
public class SimpleQueue
{
// 用字典或者其他集合型別可能會更好
private static List<Action<string>> Events = new();
public static void Reg(Action<string> action)
{
Events.Add(action);
}
public static void Send(string msg)
{
Events.ForEach(item => item(msg));
}
}
Form1.cs
public Form1()
{
InitializeComponent();
SimpleQueue.Reg(item =>
{
if (item is "ShowForm1") Show();
if (item == "HideForm1") Hide();
}
);
}
Form233.cs
private void Form233_FormClosed(object sender, FormClosedEventArgs e)
{
SimpleQueue.Send("ShowForm1");
}
這樣大致就可以實作需求了, 可還有很多問題需要解決, 有興趣可以擴展擴展
Events 用字典或者其他集合型別可能會更好, 但只是為了做個簡單演示, 不值得
我猜大概率會是重復造輪子
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/394899.html
標籤:WinForm
