ฉันใช้ MDI ค่อนข้างมากฉันชอบมันมากกว่า (สามารถใช้) ได้มากกว่ารูปแบบลอยตัวหลายแบบ
แต่เพื่อให้ได้สิ่งที่ดีที่สุดคุณจะต้องเข้าร่วมกิจกรรมของคุณเอง มันทำให้ชีวิตง่ายขึ้นมากสำหรับคุณ
ตัวอย่างโครงกระดูก
มีประเภทการขัดจังหวะของคุณเอง
//Clock, Stock and Accoubts represent the actual forms in
//the MDI application. When I have multiple copies of a form
//I also give them an ID, at the time they are created, then
//include that ID in the Args class.
public enum InteruptSource
{
IS_CLOCK = 0, IS_STOCKS, IS_ACCOUNTS
}
//This particular event type is time based,
//but you can add others to it, such as document
//based.
public enum EVInterupts
{
CI_NEWDAY = 0, CI_NEWMONTH, CI_NEWYEAR, CI_PAYDAY, CI_STOCKPAYOUT,
CI_STOCKIN, DO_NEWEMAIL, DO_SAVETOARCHIVE
}
จากนั้นพิมพ์ Args ของคุณเอง
public class ControlArgs
{
//MDI form source
public InteruptSource source { get; set; }
//Interrupt type
public EVInterupts clockInt { get; set; }
//in this case only a date is needed
//but normally I include optional data (as if a C UNION type)
//the form that responds to the event decides if
//the data is for it.
public DateTime date { get; set; }
//CI_STOCKIN
public StockClass inStock { get; set; }
}
จากนั้นใช้ผู้รับมอบสิทธิ์ภายในเนมสเปซของคุณ แต่อยู่นอกคลาส
namespace MyApplication
{
public delegate void StoreHandler(object sender, ControlArgs e);
public partial class Form1 : Form
{
//your main form
}
ตอนนี้ด้วยตนเองหรือใช้ GUI ให้ MDIparent ตอบสนองต่อเหตุการณ์ของฟอร์มย่อย
แต่ด้วย owr Args ของคุณคุณสามารถลดสิ่งนี้เป็นฟังก์ชั่นเดียว และคุณสามารถจัดเตรียมการขัดจังหวะ interupts ได้ดีสำหรับการดีบั๊ก แต่สามารถใช้ในวิธีอื่นได้เช่นกัน
เพียงแค่มีรหัสเหตุการณ์ mdiparent ของคุณชี้ไปที่ฟังก์ชันเดียว
calendar.Friday += new StoreHandler(MyEvents);
calendar.Saturday += new StoreHandler(MyEvents);
calendar.Sunday += new StoreHandler(MyEvents);
calendar.PayDay += new StoreHandler(MyEvents);
calendar.NewYear += new StoreHandler(MyEvents);
กลไกการสลับอย่างง่ายมักเพียงพอที่จะส่งผ่านเหตุการณ์ไปยังแบบฟอร์มที่เหมาะสม