1

我有一个面板。

我在其中添加了 WinForms。添加的 WinForms 的 TopLevel 和 Visible 属性设置为 FALSE 和 TRUE。

我可以做一个panel.SetChildIndex(WinForm1,0)把 WinForm1 带到前面。

我没有设法做的是跟踪ChildIndex面板的实际情况。

这个想法是在面板内有打开表单的按钮,并且当面板打开时,在菜单中添加一个新按钮Windows

就像在 VS 项目上打开许多文件时,您可以转到 Window 菜单并选择一个。此外,如果您通过单击页面更改活动页面,“窗口”菜单会自动更新并检查实际的活动页面。

我想这样做,但要使用面板容器。我已经设法完成了一切,但不是the Window menu auto-updates and checks the actual active page部分。

BringToFront()当或被SetChildIndex(form, index)调用时没有触发事件吗?当我单击面板内的另一个表单并成为“活动表单”时,是否有任何事件?或者当活动表单更改时,我可以跟踪面板的某些属性?

4

2 回答 2

2

它取自这里

当 Control 的 ZOrder 被更改时,布局操作总是在控件的容器控件中执行。

当我订阅容器的 Layout 事件并调用 BringToFront() 时,它向我展示了 Control 更改了其 ZOrder(LayoutEventArgs.AffectedControl) 和更改了属性 (LayoutEventArgs.AffectedProperty)。

于 2012-10-15T20:09:24.290 回答
1

发现当面板内的表单关闭时,面板的Controls属性会被重新索引,其中索引零是获得新焦点的表单。现在,当我关闭另一个表单时,我有一种方法可以检查前面的表单,面板中的窗口管理就完成了。

打算把源代码,也许它可以帮助某人:)

请注意,我使用的是 RadRibbonForm、标准面板和面板内的 RadForms。Rad 来自 Telerik。有些事情应该改变以使这项工作在standardWinForms上工作,但改变很小。

另外,我没有使用显示表单的菜单,而是在功能区菜单的页面中使用 RadButtonElement。

AddRadFormWindow必须调用来放置一个窗口并自动管理它。

添加窗口的示例:

AddRadFormWindow(typeof (MyRadForm))

现在,来源。它必须在 RadRibbonForm 类的代码中。

public static class ExtensionsRadForm
{
    [DllImport("user32.dll")]
    private static extern int ShowWindow(IntPtr hWnd, uint msg);

    public static void Deminimize(this RadForm form)
    {
        if (form.WindowState == FormWindowState.Minimized)
            ShowWindow(form.Handle, 9);
    }
}

    private void RefreshButtonsChecks(string windowName)
    {
        if (windowName != null)
        {
            principalPanel.Controls[windowName].BringToFront();
        }
        if (principalPanel.Controls.Count > 0)
        {
            if (principalPanel.Controls.Cast<RadForm>().Any(radForm => radForm.WindowState != FormWindowState.Minimized))
            {
                foreach (RadItem item in radRibbonBarGroupOpenWindows.Items)
                {
                    var buttonBorder = ((RadButtonElement) item).BorderElement;
                    if (item.Name == panelPrincipal.Controls[0].Name + "Button")
                    {
                        buttonBorder.ForeColor = Color.LimeGreen;
                        buttonBorder.BottomColor = Color.LimeGreen;
                        buttonBorder.TopColor = Color.LimeGreen;
                        buttonBorder.LeftColor = Color.LimeGreen;
                        buttonBorder.RightColor = Color.LimeGreen;
                        principalPanel.Controls[0].Focus();
                    }
                    else
                    {
                        buttonBorder.ForeColor = Color.Transparent;
                        buttonBorder.BottomColor = Color.Transparent;
                        buttonBorder.TopColor = Color.Transparent;
                        buttonBorder.LeftColor = Color.Transparent;
                        buttonBorder.RightColor = Color.Transparent;
                    }
                }
            }
            else
            {
                foreach (RadItem item in radRibbonBarGroupAbiertas.Items)
                {
                    var buttonBorder = ((RadButtonElement)item).BorderElement;
                    buttonBorder.ForeColor = Color.Transparent;
                    buttonBorder.BottomColor = Color.Transparent;
                    buttonBorder.TopColor = Color.Transparent;
                    buttonBorder.LeftColor = Color.Transparent;
                    buttonBorder.RightColor = Color.Transparent;
                }
            }
        }
    }
private void PrincipalPanelLayout(object sender, LayoutEventArgs e)
    {
        RefreshButtonsChecks(null);
    }
private void RadButtonElementCloseAllWindowsClick(object sender, EventArgs e)
    {
        int limitButtons = radRibbonBarGroupOpenWindows.Items.Count;
        for (int index = 0; index < limitButtons; index++)
        {
            RadItem radItem = radRibbonBarGroupOpenWindows.Items[0];
            radItem.Dispose();
        }
        int limitControls = principalPanel.Controls.Count;
        for (int index = 0; index < limitControls; index++)
        {
            Control control = principalPanel.Controls[0];
            control.Dispose();
        }
        Update();
        GC.Collect();
    }
private void AddRadFormWindow(Type windowToAdd)
    {
        if (!principalPanel.Controls.ContainsKey(windowToAdd.Name))
        {
            var window = (RadForm) Activator.CreateInstance(windowToAdd);
            window.TopLevel = false;
            window.Visible = true;
            window.FormClosing += (method, args) =>
                                       {
                                           radRibbonBarGroupOpenWindows.Items[window.Name + "Button"].Dispose();
                                           GC.Collect();
                                       };
            window.Enter += (method, args) => RefreshButtonsChecks(window.Name);
            var closeMenuItem = new RadMenuItem("Close");
            closeMenuItem.MouseDown += (method, args) =>
                                           {
                                               panelPrincipal.Controls[window.Name].Dispose();
                                               radRibbonBarGroupOpenWindows.Items[window.Name + "Button"].Dispose();
                                           };
            var contextMenu = new RadContextMenu();
            contextMenu.Items.Add(closeMenuItem);
            var button = new RadButtonElement(window.Text) {Name = window.Name + "Button"};
            button.MouseDown += (method, args) =>
                                    {
                                        switch (args.Button)
                                        {
                                            case MouseButtons.Left:
                                                if (((RadForm) principalPanel.Controls[window.Name]).WindowState ==
                                                    FormWindowState.Minimized)
                                                    ((RadForm) principalPanel.Controls[window.Name]).Deminimize();
                                                principalPanel.Controls[window.Name].BringToFront();
                                                principalPanel.Controls[window.Name].Focus();
                                                break;
                                            case MouseButtons.Right:
                                                contextMenu.Show(MousePosition);
                                                break;
                                        }
                                    };
            radRibbonBarGroupOpenWindows.Items.Add(button);
            principalPanel.Controls.Add(window);
            principalPanel.Controls[window.Name].BringToFront();
            principalPanel.Controls[window.Name].Focus();
        }
        principalPanel.Controls[windowToAdd.Name].BringToFront();
        principalPanel.Controls[windowToAdd.Name].Focus();
        Update();
        GC.Collect();
    }
public Constructor()
    {
        panelPrincipal.Layout += PanelPrincipalLayout;
    }
于 2012-10-16T02:32:04.540 回答