MDI 子停靠问题

问题描述

我使用的是 C# Windows 窗体。我有一个 MDI 应用程序,其中一个面板固定在 MDI 窗体的左侧。我打开最大化的 MDI 子窗口,效果很好。但是,我有两个不同的问题,它们可能是相互关联的,它们是:

当我单击 MDI 子窗体上的恢复按钮时,该窗体进入一种伪最小化状态,位于 MDI 父窗体的中间。无法调整它的大小并拉伸它,甚至无法移动它。然后我可以最小化它(到父级的底部),恢复它(到同样奇怪的伪最小化状态)或像以前一样最大化它。我如何让它进入正常状态...... errr......正常。

发生的另一个影响(可能相关也可能无关)是,当我打开子项时,表单的标题栏没有与 MDI 菜单集成。有子窗口栏,然后是 MDI 菜单栏。通常这些集成。

我制作了一个短视频来演示这一点,一张图片值一千字,在这里https://youtu.be/l1yFeDFJeMQ

为了清楚起见,MDI 父级的名称是“mdi”。 MDI 子窗体的名称是“frmForm”。这听起来可能很奇怪,但“frmForm”的目的是让您能够设计表单。

MDI 父窗体中的调用代码是这样的:

private bool EditForm(AppData.Server oServer,AppData.App oApp,int iFrmID)
{   
    // this edits the form passed within the indicated Appster server/app.
    frmForm oFrmForm;

    try
    {
        oFrmForm = new frmForm();
        if (!oFrmForm.EditForm(_owner,_g,oServer,oApp,iFrmID)) throw new Exception("Cannot show form for editing.");

        return true;
    }
    catch (Exception ex)
    {
        _g.Errs.Raise(ex);
        return false;
    }
}

MDI 子窗体中的代码在这里

public bool EditForm(Form oMDIParent,AppData.Globals oG,AppData.Server oServer,int iFrmID)
{
    try
    {
        _g = oG;
        _app = oApp;
        _server = oServer;
        _mode = Dolphin.enumFormEditMode.Edit;

        toolBox.Init(_g,(TextBox)fd.Controls["txtDebug"]);
        fd.Init(_g,_server);
        fd.SnapToGrid = true;
        
        svevents.Init(_g);
        svSteps.Init(_g);

        if (!ReadData(iFrmID)) throw new Exception("Could not read form data.");
        if (!PopulateParams()) throw new Exception("Could not populate parameters list correctly.");
        if (!PopulateQueries()) throw new Exception("Could not populate queries list correctly.");
        if (!PopulateModes()) throw new Exception("Could not populate modes list correctly.");
        if (!PopulateControls()) throw new Exception("Could not populate controls list correctly.");
        if (!PopulatePropControls(false)) throw new Exception("Could not populate properties control dropdown correctly.");
        if (!PopulatePropMode(false)) throw new Exception("Could not populate properties mode dropdown correctly.");
        if (!ShowData()) throw new Exception("Could not populate with form data.");
        //if (!SetControlAccess()) throw new Exception("Could not set access to controls correctly.");
        _isDirty = false; // has to happen after all the fields are setup
        if (!ValidateCtrlXml()) throw new Exception("Could not validate XML for controls."); // might set the form dirty if it has to make changes
        if (!SetFormTitle()) throw new Exception("Could not set title.");

        _g.DatProp.AddSubscriber(new DatPropSubscription(this,_server.ConnectionName,"Ctrl"));
        _g.DatProp.AddSubscriber(new DatPropSubscription(this,"Event"));
        _g.DatProp.AddSubscriber(new DatPropSubscription(this,"FrmMode"));
        _g.DatProp.AddSubscriber(new DatPropSubscription(this,"FrmParam"));
        _g.DatProp.AddSubscriber(new DatPropSubscription(this,"FrmQuery"));
        _g.DatProp.AddSubscriber(new DatPropSubscription(this,"MacroStep"));

        this.MdiParent = oMDIParent;
        this.WindowState = FormWindowState.Maximized;
        this.Show();

        txtName.Focus();
        txtName.SelectionStart = 0;
        txtName.SelectionLength = txtName.Text.Length;

        tcForm.SelectedTab = tcForm.TabPages["tabDesign"];

        return true;
    }
    catch (Exception ex)
    {
        _g.Errs.Raise(ex);
        return false;
    }
}

即使代码强制窗体为 WindowState.normal,它仍然以最大化的方式打开。我错过了什么?

编辑:我已按照下方“如何避免屏幕弹跳”链接中的建议进行了更改。我现在有了一个不同的、奇怪的症状,并在这里制作了另一个视频:https://youtu.be/MQENr4pNonA

简而言之,MDI 子项似乎以最大化的方式打开,但并未占用 MDI 父项中的整个可用区域。

编辑 2添加了上面的调用代码

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...