我有一个小组。
我在其中添加WinForms。添加的WinForms将TopLevel和Visible属性设置为FALSE和TRUE。
我可以做panel.SetChildIndex(WinForm1,0)
将WinForm1带到前面。
我无法做的是跟踪面板的实际ChildIndex
。
我们的想法是让按钮在面板内打开表单,当面板打开时,会在Windows
菜单中添加一个新按钮。
在VS Project上打开许多文件时,您可以转到“窗口”菜单并选择一个。此外,如果您通过单击页面更改活动页面,则“窗口”菜单会自动更新并检查实际活动页面。
我想这样做,但是有一个面板容器。我已经成功完成了任务,但不是the Window menu auto-updates and checks the actual active page
部分。
调用BringToFront()
或SetChildIndex(form, index)
时是否触发了事件?当我点击面板内的另一个表格并成为“活动表格”时的任何事件?或者面板的某些属性,我可以跟踪活动表单更改时的更改?
答案 0 :(得分:2)
取自here
当控件的ZOrder被操作时,总是执行布局操作 在控制的容器控制中。
当我订阅容器的Layout事件并调用时 BringToFront()它向我展示了Control改变了它 ZOrder(LayoutEventArgs.AffectedControl)和更改的属性 (LayoutEventArgs.AffectedProperty)。
答案 1 :(得分: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;
}