Come faccio a rendere visibile uno splitter per pannelli divisi all'utente, piuttosto che essere invisibile con solo un cambio di cursore al passaggio del mouse?Rendere il divisore visibile per il pannello diviso
risposta
Prova impostazione BorderStyle Fixed3D
Un modo sarebbe quello di cambiare lo Splitter BackColor
e Width/Height
proprietà (a seconda dell'orientamento del splitter)
Oltre a rendere la sua BorderStyle Fixed3D come @BlueMonkMN suggerito spesso trovo il valore predefinito di SplitterWidth sull'oggetto splitContainer, di 4, è un po 'stretto.
Se si sale a circa 6, con un bordo 3D, è un po 'più evidente per l'utente.
È possibile dipingere la propria barra di separazione aggiungendo il seguente gestore di eventi all'evento paint di splitcontainer.
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);
}
}
variante migliorata della risposta di Giles Bathgate:
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);
}
}
Questa domanda deriva dal fatto che il controllo SplitContainer
ha alcuna proprietà diretta per impostare lo stile della barra divisore trascinabili stessa.
Ci sono diversi modi per farlo, e anche se le altre risposte pubblicate qui funzionano, quella che condivido con voi sotto è in definitiva il modo veloce, affidabile e semplice.
@BluMonkMN ha suggerito un metodo utilizzando un bordo 3D, ma cosa succede se non si desidera alcun bordo?
@Giles Bathgate ha suggerito di aggiungere un gestore di eventi Paint che, anche se sicuramente è elegante e funziona, presenta un leggero costo in termini di prestazioni che richiede di aggiungere più codice al progetto che viene eseguito a livello C# e potrebbe un giorno diventare un problema di manutenzione.
@Philip Fourie ha suggerito di modificare il valore della proprietà SplitContainer.BackColor
; tuttavia, che inizialmente, l'intero sfondo del controllo cambia colore, non solo la barra di separazione, causando alcun contrasto di colore.
Quindi, la mia soluzione è un miglioramento di @Philip Fourie.
In primo luogo, menzionerò che lo SplitContainer
ha in realtà due sub-contenitori distinti, entrambi separati dalla barra di separazione. Questi due sono rappresentati dalle proprietà Panel1
e Panel2
. Ciascuno di essi è essenzialmente un contenitore di pannelli con le proprie proprietà BackColor
, oltre a diverse altre proprietà.
Il SplitContainer
ha proprio BackColor
proprietà, per un totale di tre colori unici possibili.
Ora, se si dovesse impostare questa proprietà SplitContainer.BackColor
, i Panel1
e Panel2
"subcontrols" avrebbe ereditato automaticamente che il valore del colore, e ora saremmo tutti uguali, che non provoca contrasto visivo!
Questo [probabilmente indesiderato] valore della proprietà eredità accade solo quando le e/o le Panel2.BackColor
proprietà Panel1.BackColor
hanno non ancora stata esplicitamente impostata da voi (anche se la visualizzazione dei loro valori di proprietà in Visual finestra di Studio delle proprietà prima del tempo avrebbe rivelato "controllo")
Pertanto, l'ordine in cui si impostano le proprietà è importante:
- impostare sia il "bambino"
Panel1.BackColor
ePanel2.BackColor
proprietà a qualcosa di diverso da il valore predefinito di "Con trol "per forzare un valore esplicito (anche se davvero vuoi" Control "; lo ripareremo più tardi.) - Imposta il "genitore"
SplitContainer.BackColor
sul colore che desideri sia la barra di separazione. - Infine, tornare indietro e impostare le
Panel1.BackColor
ePanel2.BackColor
proprietà al colore che si desidera loro di essere (forse torna a "Control".)
E come rispose @Philip Fourie, si potrebbe desiderare di impostare la Proprietà Width, denominata in modo coerente SplitterWidth
, indipendentemente dalla proprietà [Horizontal vs. Vertical] Orientation
.
Ecco alcuni consigli utili:
Mentre si lavora in Visual Studio sotto forma di design, se si fa clic sul SplitContainer
su entrambi i lati della barra di divisione, dovrai selezionare chePanel1
o Panel2
"bambino" sub-contenitore. Ma se si fa clic sulla barra di separazione stessa, si seleziona il "genitore" SplitContainer
.
E in relazione a quanto suggerito da @Stuart Helwig, il valore predefinito SplitterWidth
farà sì che la barra di separazione sia delineata quando è attiva, oscurando in tal modo il colore selezionato. Aumentare il valore a 5
, 6
o superiore, il che rende anche più facile per l'utente finale afferrare il trascinamento di &.
Terminato. Felice codifica!
Ooh. Creativo e semplice. Mi piace! – Nyerguds
Questa dovrebbe essere la risposta corretta, soprattutto perché consente di cambiare il colore dello splitter. È anche molto facile cambiare il colore usando questo metodo, nonostante la durata della risposta (a causa di ulteriori dettagli forniti) – elmer007
Ecco una rapida implementazione di uno splitter orizzontale riempito con un colore, ha un bordo superiore e inferiore (simile agli splitter di Visual Studio) e punti di presa nel mezzo.
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);
}
}
È possibile creare una penna come una variabile membro della classe che esegue il prelievo con cui si disegna una linea tratteggiata nel vostro simile a:
private static Pen _dashedPen = new Pen(Color.DarkRed, 1);
_dashedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
Puoi includere il codice per inizializzare la penna tratteggiata? –
Impostare la proprietà BackColor
del SplitContainer
a diversi colore. Diciamo nero. Quindi, ogni SpliterPanel
, modifica la sua proprietà BackColor
in un altro colore. Diciamo Bianco. Quindi noterai che SplitLine diventerà più visibile. :)
Questa è la stessa risposta di GlobalSoftwareSociety – TheLethalCoder
La linea di divisione è effettivamente visibile. La vera domanda è che è difficile distinguere con altri controlli.
Un'idea è di impostare un nuovo colore di sfondo per il contenitore diviso e renderlo diverso con i relativi riquadri secondari.
Forse a volte potremmo risolvere il problema dal punto di vista del progettista, non dello sviluppatore. :-)
Questa è la stessa risposta di GlobalSoftwareSociety – TheLethalCoder
È possibile utilizzare SplitterColor nella finestra di progettazione per modificare il colore del bordo del divisore.
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);
}
}
}
}
Dopo aver provato alcuni dei metodi suggeriti qui e non mi diverte, ho deciso di mettere in un panel1 e in Panel2 un sottile etichette, allineati allo splitter e tutto è ok.
(label's.Autosize=false, label's.Text = "", label's.Color=SystemColor.Selected, label1.Dock=left; label2.Dock=right)
- 1. Come rendere visibile il pulsante?
- 2. Pannello diviso utilizzando la proprietà Ridimensiona CSS3
- 3. Come riorganizzare un pannello diviso in Emacs?
- 4. Come rendere trasparente il modulo mantenendo il componente visibile?
- 5. Come rendere il corpo del pannello Bootstrap ad altezza fissa
- 6. Come rendere il layout del pannello espandibile in Android?
- 7. Il più grande divisore comune
- 8. Come trovare il divisore per massimizzare il resto?
- 9. Come rendere il pulsante trasparente nella mia app ancora visibile
- 10. diviso il testo in linee per il numero di caratteri
- 11. come rendere l'etichetta visibile/invisibile?
- 12. Mantenimento di un pannello contenitore diviso a larghezza fissa?
- 13. dipingendo un pulsante nel pannello Winform mentre il pannello scorre.
- 14. Come ridimensionare il pannello WorldWind?
- 15. Come posso ottenere il divisore predefinito?
- 16. Il divisore degli attributi senza istanziare?
- 17. Modificare il colore del divisore in LinearLayout
- 18. Divisore per LinearLayout verticale?
- 19. C# trova il massimo comun divisore
- 20. Cambia il colore del divisore di Spinner
- 21. JS come trovare il massimo comune divisore
- 22. Come cambiare il colore predefinito divisore per tutte ListViews
- 23. Programma C++ per calcolare il massimo comun divisore
- 24. C'è un modo per rendere visibile il codice GUI generato da IDEA?
- 25. php diviso per preg_split
- 26. Come rendere sempre visibile Pikaday DatePicker
- 27. Rendere visibile la barra di scorrimento verticale
- 28. Android: come rendere la tastiera sempre visibile?
- 29. Il pannello non si attiva
- 30. Come posso rendere visibile un input?
Questo funziona quando lo splitter è orientato verticalmente, il codice potrebbe essere migliorato per funzionare indipendentemente dall'orientamento. –
Sì può essere semplificato in: 'e.Graphics.FillRectangle (Brushes.LightGray, s.SplitterRectangle);' – Brett