如何单独保存/打开多张子窗体GraphicsForm中的内容?
实现MDI子窗体的单独保存与打开功能
现有两个窗体:MainForm(主窗体)与GraphicsForm(绘图子窗体)。主窗体包含「New」「Save」「Open」按钮,点击「New」可创建多个GraphicsForm子窗体。需求是:当存在多个子窗体时,仅对当前激活的子窗体执行保存或打开操作。
现有代码核心问题
当前所有子窗体共用同一个ContentDoc实例,导致所有子窗体的绘图内容完全同步,无法实现单独保存/打开。解决第一步是给每个子窗体分配独立的ContentDoc。
1. 修正子窗体的ContentDoc实例分配
修改MainForm的New_Click方法,每次创建子窗体时生成独立的ContentDoc:
private void New_Click(object sender, EventArgs e) { _winMenuItem.Name = "Win"; _winMenuItem.Text = "Windows"; int item = MainMenuStrip.Items.IndexOf(_winMenuItem); if (item == -1) { MainMenuStrip.Items.Add(_winMenuItem); MainMenuStrip.MdiWindowListItem = _winMenuItem; } // 为每个新子窗体创建独立的ContentDoc var contentDoc = new ContentDoc(); var graphicsForm = new GraphicsForm(contentDoc); graphicsForm.Name = string.Concat("Win_", _counter.ToString()); graphicsForm.Text = graphicsForm.Name; graphicsForm.MdiParent = this; graphicsForm.Show(); graphicsForm.WindowState = FormWindowState.Maximized; _counter++; }
同时调整GraphicsForm,为ContentDoc提供外部访问途径(推荐用属性封装,而非直接暴露字段):
public partial class GraphicsForm : Form { private ContentDoc _contentDoc; // 提供公开属性供主窗体访问 public ContentDoc ContentDoc => _contentDoc; public GraphicsForm(ContentDoc contentDoc) { InitializeComponent(); _contentDoc = contentDoc; } private void Canvas_MouseDown(object sender, MouseEventArgs e) { // 原有绘图逻辑不变 } private void Canvas_Paint(object sender, PaintEventArgs e) { // 原有绘图逻辑不变 } // ...其他方法 }
2. 实现「Save」功能:保存当前激活子窗体内容
在MainForm的Save_Click方法中,先获取当前激活的子窗体,再执行保存逻辑:
private void Save_Click(object sender, EventArgs e) { // 获取当前激活的MDI子窗体,并转换为GraphicsForm类型 var activeForm = this.ActiveMdiChild as GraphicsForm; if (activeForm == null) { MessageBox.Show("请先激活一个绘图窗体"); return; } // 弹出保存文件对话框 using (var saveFileDialog = new SaveFileDialog()) { saveFileDialog.Filter = "绘图文件 (*.draw)|*.draw|所有文件 (*.*)|*.*"; saveFileDialog.Title = "保存绘图内容"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { // 调用ContentDoc的保存方法(需自行实现SaveToFile逻辑) activeForm.ContentDoc.SaveToFile(saveFileDialog.FileName); // 可更新子窗体标题显示文件名 activeForm.Text = Path.GetFileName(saveFileDialog.FileName); MessageBox.Show("保存成功"); } } }
3. 实现「Open」功能:向当前激活子窗体加载内容
在MainForm的Open_Click方法中,获取激活子窗体后加载文件并刷新绘图区域:
private void Open_Click(object sender, EventArgs e) { var activeForm = this.ActiveMdiChild as GraphicsForm; if (activeForm == null) { MessageBox.Show("请先激活一个绘图窗体"); return; } using (var openFileDialog = new OpenFileDialog()) { openFileDialog.Filter = "绘图文件 (*.draw)|*.draw|所有文件 (*.*)|*.*"; openFileDialog.Title = "打开绘图文件"; if (openFileDialog.ShowDialog() == DialogResult.OK) { // 调用ContentDoc的加载方法(需自行实现LoadFromFile逻辑) activeForm.ContentDoc.LoadFromFile(openFileDialog.FileName); // 刷新画布,让新内容显示 activeForm.Canvas.Invalidate(); // 更新子窗体标题 activeForm.Text = Path.GetFileName(openFileDialog.FileName); MessageBox.Show("加载成功"); } } }
内容的提问来源于stack exchange,提问作者user10242552
相关产品推荐
相关产品推荐

