2010-03-06 9 views

risposta

29

Prova impostazione BorderStyle Fixed3D

2

Un modo sarebbe quello di cambiare lo Splitter BackColor e Width/Height proprietà (a seconda dell'orientamento del splitter)

1

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.

14

È 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); 
    } 
} 
+1

Questo funziona quando lo splitter è orientato verticalmente, il codice potrebbe essere migliorato per funzionare indipendentemente dall'orientamento. –

+0

Sì può essere semplificato in: 'e.Graphics.FillRectangle (Brushes.LightGray, s.SplitterRectangle);' – Brett

0

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); 
    } 
} 
34

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:

  1. impostare sia il "bambino" Panel1.BackColor e Panel2.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.)
  2. Imposta il "genitore" SplitContainer.BackColor sul colore che desideri sia la barra di separazione.
  3. Infine, tornare indietro e impostare le Panel1.BackColor e Panel2.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!

+3

Ooh. Creativo e semplice. Mi piace! – Nyerguds

+0

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

0

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; 
+0

Puoi includere il codice per inizializzare la penna tratteggiata? –

0

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. :)

+0

Questa è la stessa risposta di GlobalSoftwareSociety – TheLethalCoder

-1

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. :-)

+0

Questa è la stessa risposta di GlobalSoftwareSociety – TheLethalCoder

2

È 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); 
      } 
     } 
    } 
} 
0

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) 
Problemi correlati