Wie mache ich einen Split-Panel-Splitter für den Benutzer sichtbar, anstatt unsichtbar zu sein, wenn nur ein Mauszeiger über die Maus bewegt wird?Splitter für Split-Panel sichtbar machen
Antwort
Versuchen Rahmenart zu Fixed3D
Eine Möglichkeit Einstellung wäre die BackColor
und Width/Height
Eigenschaften der Splitter zu ändern (auf die Ausrichtung des Splitter abhängig)
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.
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);
}
}
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);
}
}
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:
- Set sowohl das „Kind“
Panel1.BackColor
undPanel2.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.) - Stellen Sie den "Eltern"
SplitContainer.BackColor
auf die Farbe ein, die Sie für die Splitterleiste wünschen. - Schließlich gehen Sie zurück und stellen Sie die
Panel1.BackColor
undPanel2.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!
Ooh. Kreativ und einfach. Ich mag das! – Nyerguds
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
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;
Könnten Sie den Code zur Initialisierung der gestrichelten Stift hinzufügen? –
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. :)
Dies ist das gleiche wie die Antwort von GlobalSoftwareSociety – TheLethalCoder
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. :-)
Dies ist das gleiche wie die Antwort von GlobalSoftwareSociety – TheLethalCoder
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);
}
}
}
}
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.
- 1. Einen CDialog sichtbar machen
- 2. Wie interne Schnittstellen für Moq sichtbar machen?
- 3. Interne Klassen für andere sichtbar machen Assemblies
- 4. Splitter für Twitter Bootstrap
- 5. Code für Splitter in vb.net
- 6. Splitter Controls für VB 6.0
- 7. Die Hauptscrollleiste immer sichtbar machen
- 8. auf Android-Listenansicht sichtbar machen?
- 9. ToolStripSplitButton Splitter Ausgabe
- 10. Bash-Profil für Nicht-Login-Shell sichtbar machen
- 11. Wie kann ich meine MySQL-Datensätze für Suchmaschinen sichtbar machen?
- 12. Wie libusb-Bibliothek für ein anderes Programm sichtbar machen?
- 13. Kotlin: Machen Sie eine interne Funktion für Unit-Tests sichtbar
- 14. Typoskript: Klasse sichtbar innen Modul machen nur
- 15. Android Verstecken/Sichtbar machen App-Symbol programmatisch
- 16. String Splitter in .NET
- 17. NullToVisibilityConverter sichtbar zu machen, wenn nicht null
- 18. Zugriff machen Listenfeld sichtbar beim Anklicken Button
- 19. Android: Wie Textview sichtbar mit Polsterung machen
- 20. Wie ein UIView sichtbar in ios machen
- 21. Machen Sie einen Teil von UIView sichtbar
- 22. Einen UITabbarController in jeder Ansicht sichtbar machen
- 23. wie Kontrollkästchen bei mehreren Auswahlmöglichkeiten sichtbar machen
- 24. Ein anderes div sichtbar machen bei Mauseingabe
- 25. jQuery UI und Splitter
- 26. Qt-Splitter deaktivieren
- 27. jquery Splitter Wechsel zu vertikalen Splitter auf Knopf klicken
- 28. Dynamische JQuery Splitter Plugin
- 29. Div Splitter Größe Probleme
- 30. Stretch-Panel mit Splitter
Dies funktioniert, wenn der Splitter vertikal orientiert ist, könnte der Code unabhängig von der Ausrichtung verbessert werden. –
Ja, es kann vereinfacht werden: 'e.Graphics.FillRectangle (Brushes.LightGray, s.SplitterRectangle);' – Brett