2010-03-06 16 views

Antwort

2

Eine Möglichkeit Einstellung wäre die BackColor und Width/Height Eigenschaften der Splitter zu ändern (auf die Ausrichtung des Splitter abhängig)

1

Neben seiner Rahmenart Fixed3D machen als @BlueMonkMN vorgeschlagen oft finde ich Der Standardwert SplitterWidth für das Objekt splitContainer (4) ist etwas schmal.

Wenn Sie sich, dass bis etwa 6, mit einer 3D-Grenze, es ist ein wenig deutlicher für den Benutzer.

14

Sie könnten Ihre eigene Splitterleiste erstellen, indem Sie dem Splitter-Ereignis paintcontainer den folgenden Ereignishandler hinzufügen.

private void SplitterPaint(object sender, PaintEventArgs e) 
{ 
    SplitContainer s = sender as SplitContainer; 
    if (s != null) { 
     int top = 5; 
     int bottom = s.Height - 5; 
     int left = s.SplitterDistance; 
     int right = left + s.SplitterWidth - 1; 
     e.Graphics.DrawLine(Pens.Silver, left, top, left, bottom); 
     e.Graphics.DrawLine(Pens.Silver, right, top, right, bottom); 
    } 
} 
+1

Dies funktioniert, wenn der Splitter vertikal orientiert ist, könnte der Code unabhängig von der Ausrichtung verbessert werden. –

+0

Ja, es kann vereinfacht werden: 'e.Graphics.FillRectangle (Brushes.LightGray, s.SplitterRectangle);' – Brett

0

verbesserte Variante von Giles Bathgate Antwort:

private void ds_SplitContainer_Paint(object sender, PaintEventArgs e) 
{ 
    SplitContainer l_SplitContainer = sender as SplitContainer; 

    if (l_SplitContainer != null) 
    { 
     Rectangle ll_ShrinkedSplitterRectangle = l_SplitContainer.SplitterRectangle; 
     ll_ShrinkedSplitterRectangle.Offset(0, 2); 
     ll_ShrinkedSplitterRectangle.Height = ll_ShrinkedSplitterRectangle.Height - 2; 
     e.Graphics.FillRectangle(Brushes.Silver, ll_ShrinkedSplitterRectangle); 
    } 
} 
34

Diese Frage stellt sich, weil die SplitContainer Kontrolle hat keine direkte Eigenschaft für sich den Stil der ziehbar Trennleiste zu setzen.

Es gibt mehrere Möglichkeiten, dies zu erreichen, und auch wenn die anderen Antworten gepostet hier arbeiten, die eine, die ich unten mit Ihnen teilen, ist letztlich die schnelle, zuverlässige und einfachste Weg.

@BluMonkMN vorgeschlagen, ein Verfahren zur Herstellung eines 3D-Rahmen verwendet wird, aber was ist, wenn Sie wollen keine Grenze?

@Giles Bathgate schlug vor, einen Paint-Event-Handler hinzuzufügen, der, obwohl er elegant ist und funktioniert, mit geringen Performance-Kosten einhergeht, sodass Sie mehr Code zu Ihrem Projekt hinzufügen müssen, das auf C# -Ebene ausgeführt wird ein Wartungsproblem.

@Philip Fourie vorgeschlagen, den SplitContainer.BackColor Eigenschaftswert zu ändern; jedoch, dass anfänglich bewirkt, dass der gesamte Hintergrund des Steuerelements die Farbe ändert, nicht nur die Trennleiste, wodurch kein Farbkontrast verursacht wird.

Also, meine Lösung ist eine Verbesserung von @Philip Fourie's.

Zunächst möchte ich erwähnen, dass die-tatsächlich zwei verschiedene Subcontainer hat, die beide durch die Trennleiste getrennt sind. Diese zwei werden durch die Panel1 und die Panel2 Eigenschaften dargestellt. Jeder von ihnen ist im Wesentlichen ein Panel-Container mit eigenen BackColor Eigenschaften, zusätzlich zu einigen anderen Eigenschaften.

Die SplitContainer hat seine eigene BackColor Eigenschaft, insgesamt drei einzigartigen möglichen Farben zu machen.

Nun, wenn Sie diese SplitContainer.BackColor Eigenschaft setzen sind, die Panel1 und Panel2 „subcontrols“ würde, dass Farbwert, automatisch erbt und jetzt würden sie alle gleich sein, keinen visuellen Kontrast zu verursachen!
Diese [wahrscheinlich unerwünschte] Eigenschaft Wert Vererbung geschieht nur, wenn die Panel1.BackColor und/oder die Panel2.BackColor Eigenschaften noch nicht explizit von Ihnen festgelegt wurden (obwohl ihre Eigenschaft Werte im Visual Studio Properties-Fenster vor der Zeit angezeigt hätte ergeben haben „Control“)

Daher ist die Reihenfolge, dass Sie die Eigenschaften festgelegt ist wichtig:

  1. Set sowohl das „Kind“ Panel1.BackColor und Panel2.BackColor Eigenschaften etwas andere als der Standardwert von „Con trol "um einen expliziten Wert zu erzwingen (auch wenn Sie wirklich" Control "wollen); das werden wir später beheben.)
  2. Stellen Sie den "Eltern" SplitContainer.BackColor auf die Farbe ein, die Sie für die Splitterleiste wünschen.
  3. Schließlich gehen Sie zurück und stellen Sie die Panel1.BackColor und Panel2.BackColor Eigenschaften der Farbe, die Sie ihnen (vielleicht wieder auf „Control“.)

Und als @Philip Fourie beantwortet sein wollen, können Sie das einstellen möchten Width-Eigenschaft, eigentlich einheitlich SplitterWidth, ungeachtet der [Horizontal vs. Vertical] Orientation Eigenschaft.

Hier sind einige nützliche Tipps:

Während in der Visual Studio Form Designer arbeiten, wenn Sie auf der SplitContainer auf beiden Seiten der Trennleiste klicken, werden Sie wählen dassPanel1 oder Panel2 „Kind“ Sub-Container. Aber wenn Sie auf die Splitterleiste selbst klicken, wählen Sie das "Eltern" SplitContainer.

Und in Bezug auf was @Stuart Helwig vorgeschlagen, wird die Standard-SplitterWidth wird die Trennleiste umrissen werden, wenn es den Fokus hat, so verdunkelt die ausgewählte Farbe. Erhöhen Sie den Wert auf 5, 6 oder höher, was es dem Endbenutzer auch leichter macht, & zu ziehen.

Fertig. Glückliche Kodierung!

+3

Ooh. Kreativ und einfach. Ich mag das! – Nyerguds

+0

Dies sollte die richtige Antwort sein, vor allem da es die Farbe des Splitters ändern kann. Es ist auch wirklich einfach, die Farbe mit dieser Methode zu ändern, trotz wie lange die Antwort ist (aufgrund zusätzlicher Details zur Verfügung gestellt) – elmer007

0

Hier ist eine schnelle Implementierung eines horizontalen Splitter, der mit einer Farbe gefüllt ist, einen oberen und unteren Rand hat (ähnlich Visual Studio Splitter), und Greiferpunkte in der Mitte.

private void splitContainer_Paint(object sender, PaintEventArgs e) 
    { 
     SplitContainer s = sender as SplitContainer; 
     if (s != null) 
     { 
      int gripLineWidth = 9; 
      // Fill Splitter rectangle 
      e.Graphics.FillRectangle(SystemBrushes.ControlDark, 
       s.SplitterRectangle.X, s.SplitterDistance, s.SplitterRectangle.Width, s.SplitterWidth); 
      // Draw Single Line Border on Top and Bottom 
      e.Graphics.DrawLine(Pens.LightSlateGray, 
       s.SplitterRectangle.X, s.SplitterDistance, s.SplitterRectangle.Width, s.SplitterDistance); 
      e.Graphics.DrawLine(Pens.LightSlateGray, 
       s.SplitterRectangle.X, s.SplitterDistance + s.SplitterWidth - 1, s.SplitterRectangle.Width, s.SplitterDistance + s.SplitterWidth - 1); 
      // Draw gripper dots in center 
      e.Graphics.DrawLine(_dashedPen, 
       ((s.SplitterRectangle.Width/2) - (gripLineWidth/2)), 
       s.SplitterDistance + s.SplitterWidth/2, 
       ((s.SplitterRectangle.Width/2) + (gripLineWidth/2)), 
       s.SplitterDistance + s.SplitterWidth/2); 
     } 
    } 

Sie können einen Stift als Member-Variable in der Klasse erstellen, die die Zeichnung führen, die eine gestrichelte Linie in Ihrem ähnlich zeichnen wird:

private static Pen _dashedPen = new Pen(Color.DarkRed, 1); 
_dashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot; 
+0

Könnten Sie den Code zur Initialisierung der gestrichelten Stift hinzufügen? –

0

die BackColor Eigenschaft der SplitContainer an verschiedenen Stellen Farbe. Sagen wir Schwarz. Dann jede SpliterPanel, ändern Sie ihre BackColor Eigenschaft in andere Farbe. Sagen wir mal Weiß. Dann werden Sie bemerken, dass die SplitLine sichtbarer wird. :)

+0

Dies ist das gleiche wie die Antwort von GlobalSoftwareSociety – TheLethalCoder

-1

Die Trennlinie ist tatsächlich sichtbar. Die wirkliche Frage ist, dass es schwierig ist, sich mit anderen Kontrollen zu unterscheiden.

Eine Idee besteht darin, dem geteilten Container eine neue Hintergrundfarbe zuzuweisen und sie mit seinen untergeordneten Feldern anders zu gestalten.

Vielleicht konnten wir das Problem manchmal aus der Sicht des Entwicklers lösen, nicht des Entwicklers. :-)

+0

Dies ist das gleiche wie die Antwort von GlobalSoftwareSociety – TheLethalCoder

2

Sie können SplitterColor im Designer verwenden, um Splitterrahmenfarbe zu ändern.

public class SplitContainerCustomSplitter : SplitContainer 
{ 
    [DefaultValue(typeof(Color), "Black")] 
    public Color SplitterColor { get; set; } = Color.Black; 

    protected override void OnPaint(PaintEventArgs pevent) 
    { 
     Graphics g = pevent.Graphics; 
     Rectangle rect = SplitterRectangle; 

     using (Pen pen = new Pen(SplitterColor)) 
     { 
      if (Orientation == Orientation.Vertical) 
      { 
       g.DrawLine(pen, rect.Left, rect.Top, rect.Left, rect.Bottom - 1); 
       g.DrawLine(pen, rect.Right - 1, rect.Top, rect.Right - 1, rect.Bottom - 1); 
      } 
      else 
      { 
       g.DrawLine(pen, rect.Left, rect.Top, rect.Right - 1, rect.Top); 
       g.DrawLine(pen, rect.Left, rect.Bottom - 1, rect.Right, rect.Bottom - 1); 
      } 
     } 
    } 
} 
0

Nach einem paar der Methoden versuchen, hier und nicht amüsiert mich vorgeschlagen, entschied ich mich in einem panel1 und in panel2 einer dünnen Etiketten an den Splitter ausgerichtet zu setzen, und alles ist in Ordnung.

Verwandte Themen