Comment rendre un séparateur de panneaux divisés visible pour l'utilisateur, plutôt que d'être invisible avec seulement un changement de curseur sur la souris?Rendre le séparateur visible pour le panneau de division
Répondre
Essayez de régler BorderStyle Fixed3D
Une façon serait de changer les propriétés de Splitter BackColor
et Width/Height
(selon l'orientation du séparateur)
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.
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);
}
}
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);
}
}
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:
- définir à la fois le « enfant »
Panel1.BackColor
etPanel2.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.) - Réglez le « parent »
SplitContainer.BackColor
à la couleur que vous désirez la barre de séparation soit. - Enfin, revenir en arrière et définissez les
Panel1.BackColor
etPanel2.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!
Ooh. Créatif et simple. J'aime ça! – Nyerguds
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
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;
Pourriez-vous inclure le code pour initialiser le pointillé? –
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. :)
Ceci est la même que la réponse par GlobalSoftwareSociety – TheLethalCoder
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. :-)
Ceci est la même que la réponse par GlobalSoftwareSociety – TheLethalCoder
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);
}
}
}
}
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)
- 1. C++ fichier io et division par le séparateur
- 2. JavaScript: Rendre le premier élément caché visible
- 3. Rendre un contrôle de panneau ASP.NET visible sur le dessus d'autres contenus
- 4. Comment rendre le validateur RequiredField visible
- 5. Rendre le masque visible dans ActionScript 3.0
- 6. Android: Comment rendre le clavier toujours visible?
- 7. Comment faire pour rendre le panneau à div différent lorsque le panneau déjà rendre à un autre div
- 8. Comment faire pour rendre le panneau à div différent lorsque le panneau déjà rendre à un autre div
- 9. Comment rendre le séparateur (Single Line) transparent dans Tableview?
- 10. Charger l'image dans PictureBox avant de rendre le contrôle visible
- 11. Rendre le défilement de la liste d'étincelles visible par défaut
- 12. Comment rendre le contenu de Expander visible à VisualTreeHelper
- 13. PowerShell pour ouvrir Outlook, rendre visible
- 14. FLEX 4 s: Scroller, comment rendre le composant contenu visible?
- 15. Concepteur WinForms: Ajouter un contrôle et le rendre visible pour le concepteur
- 16. Comment puis-je rendre un menu visible après le clic?
- 17. Le contrôle utilisateur sur le panneau reste visible lorsque le paramètre est défini sur false
- 18. Comment rendre WPF Adorner visible
- 19. Attendez jusqu'à ce que le panneau de préférences soit complètement visible pour montrer la feuille?
- 20. Code pour le séparateur dans vb.net
- 21. Le contenu de Ext.Carousel n'est pas visible
- 22. Panneau d'accordéon avec option visible utilisant jQuery
- 23. Rendre la sélection de plage programmatique visible pour l'utilisateur?
- 24. Readline, le séparateur d'enregistrement et le Ruby
- 25. API de contact stockant le contact comme un contact invisible: comment le rendre visible?
- 26. Supprimer ou dessiner le dernier séparateur UITableView
- 27. Comment rendre ma classe privée visible pour les conteneurs STD?
- 28. Rendre l'assemblage .NET COM-visible et fonctionnant pour VB5
- 29. SugarCRM 5 - Créer un sous-panneau pour les factures dans le panneau de compte
- 30. Séparateur de ligne dans le logiciel datalist
Cela fonctionne lorsque le séparateur est orienté verticalement, le code pourrait être amélioré pour fonctionner quelle que soit l'orientation. –
Oui, il peut être simplifié à: 'e.Graphics.FillRectangle (Brushes.LightGray, s.SplitterRectangle);' – Brett