2010-03-06 5 views

Répondre

29

Essayez de régler BorderStyle Fixed3D

2

Une façon serait de changer les propriétés de Splitter BackColor et Width/Height (selon l'orientation du séparateur)

1

En plus de son Fixed3D BorderStyle que @BlueMonkMN a suggéré que je trouve souvent la valeur SplitterWidth par défaut sur l'objet splitContainer, de 4, est un peu étroite.

Si vous placez cela à environ 6, avec une bordure 3D, c'est un peu plus évident pour l'utilisateur.

14

Vous pouvez peindre votre propre barre de séparation en ajoutant le gestionnaire d'événements suivant à l'événement de peinture 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

Cela fonctionne lorsque le séparateur est orienté verticalement, le code pourrait être amélioré pour fonctionner quelle que soit l'orientation. –

+0

Oui, il peut être simplifié à: 'e.Graphics.FillRectangle (Brushes.LightGray, s.SplitterRectangle);' – Brett

0

variante améliorée de la réponse de 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

Cette question se pose parce que le contrôle SplitContainer a aucune propriété directe pour définir le style de la barre de séparation draggable lui-même.

Il y a plusieurs façons d'y parvenir, et même si les autres réponses postées ici fonctionnent, celle que je partage avec vous ci-dessous est finalement la façon rapide, fiable et la plus facile.

@BluMonkMN a suggéré une méthode utilisant une bordure 3D, mais que faire si vous ne voulez pas de bordure? @Giles Bathgate a suggéré d'ajouter un gestionnaire d'événements Paint qui, même s'il est élégant et fonctionne, présente un léger coût de performance qui nécessite d'ajouter plus de code à votre projet qui s'exécute au niveau C# et peut devenir un jour un problème de maintenance.

@Philip Fourie a suggéré de changer la valeur de la propriété SplitContainer.BackColor; cependant, initialement provoque le changement de couleur de l'arrière-plan entier de la commande, pas seulement la barre de séparation, ce qui ne provoque aucun contraste de couleur. Donc, ma solution est une amélioration de @Philip Fourie. D'abord, je mentionnerai que le SplitContainer a en réalité deux sous-conteneurs distincts, tous deux séparés par la barre de séparation. Ces deux sont représentés par les propriétés Panel1 et Panel2. Chacun d'eux est essentiellement un conteneur Panel avec leurs propres propriétés BackColor, en plus de plusieurs autres propriétés.

Le SplitContainer a sa propriété BackColor, soit un total de trois couleurs uniques possibles.

Maintenant, si vous deviez définir cette propriété SplitContainer.BackColor, les Panel1 et Panel2 « héritera » sous-contrôles automatiquement que la valeur de couleur, et maintenant ils seraient tous les mêmes, sans faire contraste visuel!
Cet héritage de valeur de propriété [probablement indésirable] ne se produit que lorsque les propriétés Panel1.BackColor et/ou Panel2.BackColor ont pas encore explicitement définies par vous (même si l'affichage à l'avance de leurs valeurs de propriétés dans la fenêtre Propriétés de Visual Studio aurait révélé «Control »)

Par conséquent, l'ordre que vous définissez les propriétés est important:

  1. définir à la fois le « enfant » Panel1.BackColor et Panel2.BackColor propriétés à quelque chose autre que la valeur par défaut de « Con trol "forcer une valeur explicite (même si vous voulez vraiment" Control "; nous allons corriger cela plus tard.)
  2. Réglez le « parent » SplitContainer.BackColor à la couleur que vous désirez la barre de séparation soit.
  3. Enfin, revenir en arrière et définissez les Panel1.BackColor et Panel2.BackColor propriétés à la couleur que vous voulez être (peut-être revenir à « Control ».)

Et comme réponse @Philip Fourie, vous pouvez régler la Propriété Width, nommée de manière cohérente SplitterWidth, indépendamment de la propriété [Horizontal vs. Vertical] Orientation.

Voici quelques conseils utiles:

Tout en travaillant sous la forme Visual Studio Designer, si vous cliquez sur le SplitContainer de chaque côté de la barre de séparation, vous sélectionnez quePanel1 ou Panel2 « enfant » sous-conteneur. Mais si vous cliquez sur la barre de séparation elle-même, vous sélectionnez le "parent" SplitContainer. Et lié à ce que @Stuart Helwig a suggéré, le SplitterWidth par défaut provoquera la barre de séparation à être soulignée quand elle a le focus, obscurcissant ainsi la couleur que vous avez sélectionnée. Augmentez la valeur à 5, 6, ou plus, ce qui rend également plus facile pour l'utilisateur final pour saisir & glisser.

Terminé. Codage heureux!

+3

Ooh. Créatif et simple. J'aime ça! – Nyerguds

+0

Cela devrait être la bonne réponse, d'autant plus qu'elle permet de changer la couleur du séparateur. Il est également très facile de changer la couleur en utilisant cette méthode, malgré la durée de la réponse (en raison des détails supplémentaires fournis) – elmer007

0

Voici une mise en œuvre rapide d'un séparateur horizontal qui est rempli d'une couleur, a une bordure supérieure et inférieure (similaire aux baffles Visual Studio), et des points de préhension au milieu.

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

Vous pouvez créer un stylo comme une variable membre de la classe qui exécute le dessin qui dessine une ligne en pointillé dans votre semblable à:

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

Pourriez-vous inclure le code pour initialiser le pointillé? –

0

Définissez la propriété BackColor du SplitContainer à différents Couleur. Laissez dire Black. Puis chaque SpliterPanel, modifiez sa propriété BackColor en couleur différente. Laissez dire blanc. Ensuite, vous remarquerez que SplitLine deviendra plus visible. :)

+0

Ceci est la même que la réponse par GlobalSoftwareSociety – TheLethalCoder

-1

La ligne de séparation est visible en réalité. La vraie question est qu'il est difficile de distinguer avec d'autres contrôles.

Une idée est de définir une nouvelle couleur de fond du récipient fendu, et le rendre différent avec ses panneaux enfants.

Peut-être que nous pourrions parfois résoudre le problème du point de vue du concepteur, pas du développeur. :-)

+0

Ceci est la même que la réponse par GlobalSoftwareSociety – TheLethalCoder

2

Vous pouvez utiliser SplitterColor dans le concepteur pour modifier la couleur de la bordure du séparateur.

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

Après avoir essayé quelques-unes des méthodes proposées ici et ne me amusant, j'ai décidé de mettre dans un panel1 et PANEL2 une mince étiquettes, aligné sur le séparateur et tout est ok.

(label's.Autosize=false, label's.Text = "", label's.Color=SystemColor.Selected, label1.Dock=left; label2.Dock=right) 
Questions connexes