Mam panel.
Dodaję do niego WinFormy. Dodane WinFormy mają właściwości TopLevel i Visible ustawione na FALSE i TRUE.
Mogę zrobić panel.SetChildIndex(WinForm1,0)
, aby przenieść WinForm1 na wierzch.
To, czego nie udało mi się zrobić, to śledzić rzeczywiste ChildIndex
panelu.
Pomysł polega na tym, aby przyciski otwierające formularze znajdowały się w panelu, a kiedy panel się otwiera, nowy przycisk jest dodawany w menu Windows
.
Coś na przykład, gdy wiele plików jest otwartych w projekcie VS, możesz przejść do menu Okno i wybrać jeden. Ponadto, jeśli zmienisz aktywną stronę, klikając ją, menu Okno zostanie automatycznie zaktualizowane i sprawdzi aktualnie aktywną stronę.
Chcę to zrobić, ale z kontenerem panelowym. Udało mi się zrobić wszystko, ale nie część the Window menu auto-updates and checks the actual active page
.
Czy po wywołaniu BringToFront()
lub SetChildIndex(form, index)
nie jest uruchamiane zdarzenie? Jakieś zdarzenie, kiedy klikam inny formularz znajdujący się w panelu i staje się on „aktywnym”? Lub jakaś właściwość panelu, którą mogę śledzić, gdy zmienia się aktywny formularz?
2 odpowiedzi
Stwierdzono, że gdy formularz wewnątrz panelu jest zamknięty, właściwość Controls
panelu zostaje ponownie zindeksowana, gdzie indeks zero to formularz, który uzyskuje nowy fokus. Teraz, gdy mam sposób na sprawdzenie formularza, który jest na wierzchu, gdy zamykam inny, administracja Windows w panelach jest zakończona.
Zamierzam umieścić kod źródłowy, może to komuś pomoże :)
Zauważ, że używam RadRibbonForm, standardowego panelu i RadForms wewnątrz panelu. Rad są od Telerika. Niektóre rzeczy powinny się zmienić, aby działało to na standardowych WinForms, ale zmiany są minimalne.
Ponadto nie używam menu, które pokazuje formularze, zamiast tego używam RadButtonElement na stronie menu wstążki.
AddRadFormWindow
musi zostać wywołany, aby umieścić okno i zarządzać nim automatycznie.
Przykład dodawania okna:
AddRadFormWindow(typeof (MyRadForm))
Teraz źródło. Musi znajdować się w kodzie klasy 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;
}
Pochodzi z tutaj< /a>
Gdy kontrolka ZOrder jest zmieniana, operacja układu jest zawsze wykonywana w kontrolce kontenera kontrolki.
Kiedy zasubskrybowałem zdarzenie Layout kontenera i wywołałem BringToFront(), pokazał mi Control, który zmienił jego ZOrder(LayoutEventArgs.AffectedControl) i zmienił właściwość (LayoutEventArgs.AffectedProperty).
Nowe pytania
c#
C # (wymawiane „patrz ostro”) jest językiem programowania wysokiego poziomu, statycznie typowanym, wieloparadygmatowym opracowanym przez firmę Microsoft. Kod C # zwykle jest przeznaczony dla rodziny narzędzi Microsoft .NET i czasów wykonywania, do których należą między innymi .NET Framework, .NET Core i Xamarin. Użyj tego tagu w przypadku pytań dotyczących kodu napisanego w C # lub C # formalnej specyfikacji.