Próbuję utworzyć niestandardowy panel sterowania za pomocą własnego silnika układu. muszę każdą kontrolę, która jest dodawana do mojego panelu należy dodać poniżej i wziąć pełną szerokość (-padding), jak poniżej: Panel niestandardowy z silnikiem układu
Poniżej jest mój kod:
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Layout;
namespace VContainer
{
internal class VerticalFillList : Panel
{
public VerticalFillList()
{
AutoScroll = true;
MinimumSize = new Size(200, 200);
Size = new Size(200, 300);
Padding = new Padding(10);
}
private readonly VerticalFillLayout _layoutEngine = new VerticalFillLayout();
public override LayoutEngine LayoutEngine
{
get { return _layoutEngine; }
}
private int _space = 10;
public int Space
{
get { return _space; }
set
{
_space = value;
Invalidate();
}
}
}
internal class VerticalFillLayout : LayoutEngine
{
public override bool Layout(object container, LayoutEventArgs layoutEventArgs)
{
var parent = container as VerticalFillList;
Rectangle parentDisplayRectangle = parent.DisplayRectangle;
Point nextControlLocation = parentDisplayRectangle.Location;
foreach (Control c in parent.Controls)
{
if (!c.Visible)
{
continue;
}
c.Location = nextControlLocation;
c.Width = parentDisplayRectangle.Width;
nextControlLocation.Offset(0, c.Height + parent.Space);
}
return false;
}
}
}
Powyższy kod działa poprawnie , z wyjątkiem jednej rzeczy: kiedy dodajemy kontrole do mojego kontenera, są one dodawane poprawnie (nowe poniżej rodzica, 100% szerokości), ale gdy wysokość kontrolek jest większa niż moja wysokość kontenera, otrzymuję poziome paski przewijania, ale po dodaniu kontrolek więcej paska przewijania zostanie usunięte.
samo dzieje się, gdy chcę zmienić rozmiar mojego pojemnika:
Jak to może być stałe? Po prostu muszę usunąć poziomy pasek przewijania.
Oczywiście wszystkie ulepszenia są mile widziane :)
Nie chcę używać układ tabeli lub układ płynąć jak ten daje mi dokładnie, kiedy muszę.
Potrzebuję prostego pojemnika, który zamawia wszystkie elementy sterujące dla dzieci od góry do dołu i rozciąga je w poziomie, aby zajmowały tyle samo szerokości, aby poziomy pasek przewijania nie był potrzebny.
ale jeżeli on być ustalony nie można umieścić wiadomości bottons zawsze ... O_O – MayogaX
@MajogaX - Wiem, że :) Chciałem tylko pokazać mój punkt widzenia. Będę miał niestandardowe elementy sterujące zamiast przycisków. Chciałem pokazać, jak zachowuje się mój panel. W większości przypadków będę miał 2-3 kontrolki, ale kiedy użytkownik doda nowy, chcę uniknąć sytuacji, w której widoczny jest poziomy pasek przewijania. Ta sama sytuacja przy zmianie rozmiaru mojej aplikacji. Będę tam trzymać maksymalnie 5-6 kontrolek. Powyżej jest tylko demo, które pokazuje niechciane zachowanie. – Misiu
Próbujesz rozwiązać problem, który projektanci WinForma ostrożnie przeszli w swojej klasie LayoutEngine. Takie układy są * bistabilne *. Najbardziej typowym wynikiem próby rozwiązania tego problemu jest utknięcie w nieskończonej pętli z włączonym i wyłączonym poziomym paskiem przewijania. Jesteś trochę skazany na wynurzenie klasy, a kończy się to w ten sam sposób. –