2010-04-15 16 views
16

J'ai un StatusStrip avec un seul ToolStripStatusLabel, Spring = true et une couleur d'arrière-plan pour les notifications.Comment récupérer l'espace à partir du "Grip"

Le problème est qu'il y a un carré gris laid sur le côté droit de la bande d'état. Après avoir joué pendant un moment, je me suis rendu compte que c'était la prise de dimensionnement (j'avais SizingGrip = false, GripStyle = Caché). Pourtant, même avec elle cachée, il broie encore l'espace. Je ne peux pas obtenir de contenu sur la bande d'état pour aller tout le chemin vers la droite.

Comment pourriez-vous contourner ce problème? Remarque: Je ne peux pas simplement définir la couleur de fond du StatusStrip car l'étiquette d'état change de couleur et a des effets de fondu.

Répondre

26

La propriété StatusStrip.Padding est foireuse, elle renvoie la valeur incorrecte pour Padding.Right si la poignée de dimensionnement est désactivée. Vous pouvez le réparer dans votre constructeur de formulaire, comme ceci:

public Form1() { 
    InitializeComponent(); 
    statusStrip1.Padding = new Padding(statusStrip1.Padding.Left, 
    statusStrip1.Padding.Top, statusStrip1.Padding.Left, statusStrip1.Padding.Bottom); 
} 

L'utilisation de la propriété Left pour spécifier Right est le correctif. Ne vous embêtez pas à soumettre ce bug à Connect, ils ne le répareront pas.

1

Jetez un oeil à this blog entry on MSDN. La question était de changer la taille de la poignée de dimensionnement manuellement, et je pense que l'utilisation du ToolStrip Renderer comme suggéré pourrait aussi fonctionner pour vous. Le problème que j'ai jusqu'à présent, c'est qu'il supprime la couleur d'arrière-plan sur une étiquette d'état dans le StatusStrip, donc ce n'est pas encore une solution, mais c'est un début.

public MyForm() 
    { 
     InitializeComponent(); 
     statusStrip1.Renderer = new MyRenderer(); 
    } 

    private class MyRenderer : ToolStripProfessionalRenderer 
    { 
     protected override void OnRenderStatusStripSizingGrip(ToolStripRenderEventArgs e) 
     { 
      // don't draw at all 
     } 
    } 
0

J'avais le problème suivant: quand j'ai réglé tsslSeparator.Spring = true, mon étiquette de droite a disparu immédiatement après que tsslSeparator ait perdu le focus. Le problème est apparu lorsque le dimensionnement de la poignée a été activé. Quand il a été désactivé, tout a bien fonctionné. La solution était de mettre en marge de droite pour l'étiquette droit à quelque chose de différent de 0.

tsslLogging.Margin = new Padding(0, 3, 2, 2); // this is necessary for right alignment of status bar label 

Hope this helps quelqu'un.

0

Si Microsoft n'est pas intéressant dans la fixation, il semble être une solution appropriée doit gérer toutes les orientations, et idéalement fixer toutes les bandes d'état (voir ma réponse à Get All Children pour la définition de GetAllChildren)

public static StatusStrip FixPadding(this StatusStrip ss) { 
     if (!ss.SizingGrip) { 
      var fixpad = ss.Padding; 

      if (ss.Orientation == Orientation.Horizontal) { 
       if (ss.RightToLeft == RightToLeft.No) 
        fixpad.Right = fixpad.Left; 
       else 
        fixpad.Left = fixpad.Right; 
      } 
      else 
       fixpad.Bottom = fixpad.Top; 

      ss.Padding = fixpad; 
     } 

     return ss; 
    } 

    public static void FixStatusStripPadding(this Form f) { 
     foreach (var ss in f.GetAllChildren().OfType<StatusStrip>()) 
      ss.FixPadding(); 
    }