Eigenes Bedienelement
-
Hi,
ich bin gerade dabei ein eigenes Bedienelement zu schreiben, bin auch schon recht weit, hab aber gerade 1 kleine Sache die mich stört.
Kurz was zum Steuerelement:
Es handelt sich um eine Tabelle, wo sich in jeder Zeile ein Panel befindet. Diese Panel soll dann über einen Knopf vergrössert/verkleinert werden.
In den Panels sollen später weitere Bedienelemente abgelegt werden, die dann per Drag&Drop auf eine Fläche gezogen werden können.Das Problem:
Wenn ich nun alle Panels 'aufklappe' wird die Tabelle grösser als Das Parent-Fenster, es wird also automatisch ein Scrollbalken angezeigt. Das ist ja soweit richtig.
Wenn ich aber nun alle Panels wieder 'einklappe' verschwindet der Scrollbalken nichtHat da irgendwer eine Idee was ich machen könnte ?
MfG
MarcoHier noch der Quelltext des Steuerelments
public class Expander : TableLayoutPanel { public Expander() : base() { /* Zum testen den RoWCount angeben später zur Laufzeit ändern */ this.RowCount = 5; /* ColumnCount auf 1 setzen mehr als eine Splate soll zunächst nicht möglich sein */ this.ColumnCount = 1; /* Hintergrundfarbe der Tabelle festlegen */ this.BackColor = System.Drawing.Color.Gainsboro; /* Steuerelement wird sowohl größer als auch kleiner , funktioniert nicht richtig. WARUM ?!? */ this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; /* Passt die Tabelle nicht ins übergeordnete Fenster sollen scrollbalken eingeblendet werden. */ /* Das ausblenden funktioniert allerdings nicht mehr */ this.AutoScroll = true; /* Die einzigste Spalte soll das komplette Steuerelement ausfüllen. */ this.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); /* Die Abstände der Zeilen auf 0 setzen, rechts und links soll ein kleiner Rand zu sehen sein.*/ this.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0); this.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); /* Zum testen 5 Elemente einfügen */ this.Controls.Add(new ExpanderItem("Kategorie 1"), 0, 0); this.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.Controls.Add(new ExpanderItem("Kategorie 2"), 0, 1); this.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.Controls.Add(new ExpanderItem("Kategorie 3"), 0, 2); this.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.Controls.Add(new ExpanderItem("Kategorie 4"), 0, 3); this.RowStyles.Add(new System.Windows.Forms.RowStyle()); this.Controls.Add(new ExpanderItem("Kategorie 5"), 0, 4); this.RowStyles.Add(new System.Windows.Forms.RowStyle()); } public class ExpanderItem : Panel { /* Kategorie auf-/zugeklappt*/ enum status { closed = 0, opened }; status PanelStatus = status.closed; /* Ein Button ganz oben um die Kategorie auf-/zu zuklappen*/ Button GrowShrink = null; public ExpanderItem(String CategoryName) : base() { /* Button erstellen und Optik anpassen. */ GrowShrink = new Button(); /* Flacher Button Farbe wechselt nur bei Mouseover */ GrowShrink.BackColor = System.Drawing.Color.Silver; GrowShrink.FlatStyle = System.Windows.Forms.FlatStyle.Flat; GrowShrink.FlatAppearance.BorderColor = System.Drawing.Color.White; GrowShrink.FlatAppearance.BorderSize = 0; GrowShrink.FlatAppearance.CheckedBackColor = System.Drawing.Color.Silver; GrowShrink.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray; GrowShrink.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Silver; GrowShrink.Dock = System.Windows.Forms.DockStyle.Top; GrowShrink.Padding = new System.Windows.Forms.Padding(0); GrowShrink.Margin = new System.Windows.Forms.Padding(0); /* Beschriftung und Icon für den Button setzen / positioneren */ GrowShrink.Name = CategoryName; GrowShrink.Text = " " + CategoryName; GrowShrink.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); GrowShrink.Image = global::DShow.VC.Properties.Resources.plus; GrowShrink.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; GrowShrink.Size = new System.Drawing.Size(200, 23); GrowShrink.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText; GrowShrink.UseVisualStyleBackColor = true; /* Click-ereigniss abfangen */ GrowShrink.Click += new EventHandler(this.GrowShrinkHandler); /* Panel anpassen */ this.BackColor = System.Drawing.Color.White; this.Size = new System.Drawing.Size(200, 23); this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.Dock = System.Windows.Forms.DockStyle.Top; this.Controls.Add(GrowShrink); this.Padding = new System.Windows.Forms.Padding(0); this.Margin = new System.Windows.Forms.Padding(0); } private void GrowShrinkHandler(object sender, EventArgs e) { if (PanelStatus == status.closed) { // Category öffnen (Panel vergrößern) /* Alle Controls im Panel durchlaufen um die Größe des Panels zu ermittel, * die benötigt wird um alle Controls anzuzeigen. */ int maxWidth = 0, maxHeight = 0; foreach (Control Component in this.Controls) { maxWidth = Math.Max(maxWidth, Component.Location.X + Component.Size.Width); maxHeight = Math.Max(maxWidth, Component.Location.Y + Component.Size.Height); } /* Icon ändern */ GrowShrink.Image = global::DShow.VC.Properties.Resources.minus; /* Das aufklappen soll nach unten hin abgefedert werden. */ int SlideSteps = 20; double SinSumme = 0.0; for (int Step = 0; Step < SlideSteps; Step++) SinSumme += Math.Sin(Math.PI / 2 / SlideSteps * Step); int GrowingHeight = maxHeight - Height; double GrowStep = GrowingHeight / SinSumme; for (int Step = 0; Step < SlideSteps; Step++) { Height += (int)Math.Floor(Math.Sin(Math.PI / 2 / SlideSteps * Step) * GrowStep + 0.5); System.Threading.Thread.Sleep(10); } PanelStatus = status.opened; } else { // Category schliessen (Panel verkleiner) /* Icon ändern */ GrowShrink.Image = global::DShow.VC.Properties.Resources.plus; /* Das aufklappen soll nach unten hin abgefedert werden. */ int SlideSteps = 20; double SinSumme = 0.0; for (int Step = 0; Step < SlideSteps; Step++) SinSumme += Math.Sin(Math.PI / 2 / SlideSteps * Step); int GrowingHeight = Height - GrowShrink.Height; double GrowStep = GrowingHeight / SinSumme; for (int Step = 0; Step < SlideSteps; Step++) { Height -= (int)Math.Floor(Math.Sin(Math.PI / 2 / SlideSteps * Step) * GrowStep + 0.5); System.Threading.Thread.Sleep(10); } /* diverse Versuche die Tabelle dazu zu überreden den Scrollbalken auszublenden. */ Height = GrowShrink.Height; Parent.Height = 600; Parent.Invalidate(); Parent.PerformLayout(); PanelStatus = status.closed; } } } }
So wird das Bedienelement eingebunden.
CVObjects = new Expander(); CVObjects.Dock = System.Windows.Forms.DockStyle.Right; CVObjects.Location = new System.Drawing.Point(400, 23); CVObjects.Size = new System.Drawing.Size(200, 600); CVObjects.Name = "CVObjects"; DesignerPanel.Controls.Add(this.CVObjects);
-
das fenster müsste eine eigenschaft haben, mit der sich der scrollbalken ein- / ausblenden lässt. schau am besten mal ins msdn