場景:主窗口 Form1 包含多個 UserControl,參數統一存儲在 XML。當用戶控件值改變時,需通知主窗口更新 XML 並同步其他控件顯示。
// 1. UserControl 中定義事件
public partial class ParamControl : UserControl {
// 事件參數攜帶修改後的鍵值對
public event EventHandler ParamChanged;
private void txtValue_TextChanged(object sender, EventArgs e) {
ParamChanged?.Invoke(this, new ParamChangedEventArgs(key, txtValue.Text));
}
}
public class ParamChangedEventArgs : EventArgs {
public string Key { get; }
public string Value { get; }
public ParamChangedEventArgs(string k, string v) { Key = k; Value = v; }
}
// 2. 主窗口訂閱並處理
public partial class Form1 : Form {
private void Form1_Load(object sender, EventArgs e) {
foreach (var ctrl in this.Controls.OfType()) {
ctrl.ParamChanged += OnParamChanged;
}
}
private void OnParamChanged(object sender, ParamChangedEventArgs e) {
// 更新 XML
UpdateXml(e.Key, e.Value);
// 同步其他控件/顯示日志
txtLog.AppendText($"參數 {e.Key} 更新為 {e.Value}\r\n");
}
}
避免直接在 UserControl 中持有 Form1 引用調用 public 方法,那是強耦合的「面條代碼」。