我有一个MDI表单,在其中创建了两个MDIChild表单cf1和cf2。
我有一个按钮,当单击该按钮时,应在cf1和cf2之间切换“焦点”(即,表单位于“顶部”)。
在MDI父级的构造函数中,我分别分配了cf1和cf2的MDIParent。然后我执行cf1.Show()然后执行cf2.Show(),因此cf2最终“位于顶部”或“聚焦”。
当我第一次按下切换按钮时,cf1成为焦点,而cf2变为非活动状态。
此后再进行任何尝试更改z顺序的尝试均将失败。

我尝试过Activate,ActivateMdiChild,TopMost和BringToFront,但都没有成功。

using System;
using System.Windows.Forms;

namespace MDITest
{
    public partial class Form1 : Form
    {
        private readonly ChildForm cf1 = new ChildForm();
        private readonly ChildForm cf2 = new ChildForm();

        public Form1()
        {
            InitializeComponent();
            cf1.MdiParent = this;
            cf2.MdiParent = this;
            cf1.Text = "Window 1";
            cf2.Text = "Window 2";
            cf1.Show();
            cf2.Show();
        }

        private void Child_WMSize(object sender, EventArgs e)
        {
            LblWindow1State.Text = $"Window 1 - {cf1.WindowState.ToString()}";
            LblWindow2State.Text = $"Window 2 = {cf2.WindowState.ToString()}";
        }

        private void BtnFocus_Click(object sender, EventArgs e)
        {
            //if (ActiveMdiChild == cf1) cf2.Activate();
            //if (ActiveMdiChild == cf2) cf1.Activate();

            //if (ActiveMdiChild == cf1) ActivateMdiChild(cf2);
            //if (ActiveMdiChild == cf2) ActivateMdiChild(cf1);

            //if (ActiveMdiChild == cf1) cf2.TopMost = true;
            //if (ActiveMdiChild == cf2) cf1.TopMost = true;

            if (ActiveMdiChild == cf1) cf2.BringToFront();
            if (ActiveMdiChild == cf2) cf1.BringToFront();
        }
    }
}


预期结果将是根据需要在两种形式之间切换焦点。实际结果是,我只能从cf2更改为cf1,而不能相反。

我什至尝试了shot弹枪的方法:

    if (ActiveMdiChild == cf1)
    {
        cf2.BringToFront();
        cf2.Activate();
        ActivateMdiChild(cf2);
        cf2.TopMost = true;
        cf1.TopMost = false;
    }
    if (ActiveMdiChild == cf2)
    {
        cf1.BringToFront();
        cf1.Activate();
        ActivateMdiChild(cf1);
        cf1.TopMost = true;
        cf2.TopMost = false;
    }


结果没有变化。

最佳答案

您可以使用以下代码在任意数量的Mdi子窗口之间切换:

if (MdiChildren.Length == 0)
    return;
var i = Array.IndexOf(MdiChildren, ActiveMdiChild);
MdiChildren[(MdiChildren.Length + i + 1) % MdiChildren.Length].Activate();


要么

this.Controls.OfType<MdiClient>().First()
    .SelectNextControl(ActiveMdiChild, true,true, true, true);


要么

SendKeys.SendWait("^{TAB}"); // Control + TAB as well as Control + F6


c# - 在Mdi child 之间切换-LMLPHP

关于c# - 在Mdi child 之间切换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57311961/

10-17 00:07