You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何单独保存/打开多张子窗体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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:55:22