Ich versuche, ein benutzerdefiniertes Panel-Steuerelement mit meiner eigenen Layout-Engine zu erstellen. Ich brauche jede Kontrolle, die zu meinem Panel hinzugefügt wird unten hinzugefügt werden und volle Breite (das Auffüllen) zu nehmen, wie unten: Benutzerdefinierte Panel mit Layout-Engine
Below mein Code:
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;
}
}
}
Above Code funktioniert gut , außer einer Sache: wenn ich Kontrollen meinem Behälter hinzufüge, werden sie richtig hinzugefügt (neues unter Elternteil, 100% Breite), aber wenn die Höhe der Kontrollen größer als meine Behälterhöhe ist, bekomme ich horizontale Bildlaufleisten, aber nach dem Hinzufügen paar Kontrollen Mehr Bildlaufleiste wird entfernt.
gleiche passiert, wenn ich meinen Container Größe verändert werden soll:
Wie dies behoben werden kann? Ich muss nur diese horizontale Bildlaufleiste entfernen.
Natürlich sind alle Verbesserungen sind willkommen :)
Ich will nicht Tabellenlayout verwenden oder Layout fließen, da dies ein mir genau gibt, wenn ich brauche.
Ich brauche einen einfachen Container, der alle untergeordneten Steuerelemente von oben nach unten anordnet und sie horizontal streckt, so dass sie so viel Breite benötigen, dass die horizontale Scrollbar des Containers nicht benötigt wird.
aber wenn es festgelegt werden Sie nicht Nachrichten bottons kann für immer setzen ... o_o – MayogaX
@MayogaX - Ich weiß das :) Ich wollte nur meinen Standpunkt zeigen. Ich habe benutzerdefinierte Steuerelemente anstelle von Schaltflächen. Ich wollte zeigen, wie sich mein Panel verhält. Die meiste Zeit werde ich 2-3 Kontrollen dort haben, aber wenn Benutzer neue hinzufügen, möchte ich Situation vermeiden, wenn diese horizontale Bildlaufleiste sichtbar ist. Die gleiche Situation bei der Größenanpassung meiner Anwendung. Ich werde dort maximal 5-6 Kontrollen halten. Oben ist nur eine Demo, um unerwünschtes Verhalten zu zeigen. – Misiu
Sie versuchen, ein Problem zu lösen, das die Winforms-Designer in ihrer LayoutEngine-Klasse vorsichtig beiseite geschoben haben. Layouts wie diese sind * bistabil *. Das typischste Ergebnis beim Versuch, sich damit zu befassen, besteht darin, in einer Endlosschleife zu stecken, wobei die horizontale Bildlaufleiste ein- und ausgeschaltet wird. Du bist irgendwie dazu verdammt, die Klasse neu zu erfinden und es am Ende genauso zu machen. –