2017-08-11 2 views
1

J'ai créé un contrôle utilisateur personnalisé qui affichera du texte et un voyant pour afficher l'état de fonctionnement actuel de notre service, comme indiqué dans le formulaire ci-dessous. Cela fonctionne très bien sur un formulaire, mais je veux le mettre sur un contrôle StatusStrip. J'ai créé une classe dérivée de ToolStripControlHost pour activer la prise en charge de mon contrôle sur un StatusStrip, mais elle ne s'affiche pas du tout. La largeur du contrôle est zéro et le formulaire scintille lorsqu'il est ouvert dans l'EDI.Comment afficher des graphiques sur ToolStrip

J'ai regardé la classe ToolStripRendering, mais il me semble qu'elle est destinée à être utilisée avec des contrôles existants.

Quelle est la meilleure façon d'y parvenir? Si c'est possible? Mon code est ci-dessous.

J'utilise Visual Studio 2010 avec .NET 4.0

enter image description here

Code de contrôle de l'utilisateur:

public partial class ServiceStatus : UserControl 
{ 
    public ServiceStatus() 
    { 
     IndicatorSize = new System.Drawing.Size(20, 20); 
     Padding = new Padding(1, 1, 1, 1); 
     InitializeComponent(); 
    } 

    public ServiceControllerStatus GetStatus() 
    { 
     using (var service = new ServiceController("MyService")) 
     { 
      return service.Status; 
     } 
    } 
    private void getStatusInfo(out string statusText, out Color indicatorColor) 
    { 
     try 
     { 
      ServiceControllerStatus status = GetStatus(); 
      switch (status) 
      { 
       case ServiceControllerStatus.ContinuePending: 
        statusText = Properties.Resources.SERVICE_CONTINUE_PENDING; 
        indicatorColor = Color.Yellow; 
        break; 
       case ServiceControllerStatus.Paused: 
        statusText = Properties.Resources.SERVICE_PAUSED; 
        indicatorColor = Color.Yellow; 
        break; 
       case ServiceControllerStatus.PausePending: 
        statusText = Properties.Resources.SERVICE_PAUSE_PENDING; 
        indicatorColor = Color.Yellow; 
        break; 
       case ServiceControllerStatus.Running: 
        statusText = Properties.Resources.SERVICE_RUNNING; 
        indicatorColor = Color.Green; 
        break; 
       case ServiceControllerStatus.StartPending: 
        statusText = Properties.Resources.SERVICE_START_PENDING; 
        indicatorColor = Color.Yellow; 
        break; 
       case ServiceControllerStatus.Stopped: 
        statusText = Properties.Resources.SERVICE_STOPPED; 
        indicatorColor = Color.Red; 
        break; 
       case ServiceControllerStatus.StopPending: 
        statusText = Properties.Resources.SERVICE_STOP_PENDING; 
        indicatorColor = Color.Yellow; 
        break; 
       default: 
        statusText = default(String); 
        indicatorColor = default(Color); 
        break; 
      } 
     } 
     catch 
     { 
      statusText = Properties.Resources.SERVICE_CANNOT_CONNECT; 
      indicatorColor = Color.Red; 
     } 
    } 

    public Size IndicatorSize { get; set; } 


    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     string statusText; 
     Color indicatorColor; 

     getStatusInfo(out statusText, out indicatorColor); 

     Size textSize = TextRenderer.MeasureText(e.Graphics, statusText, Font, new Size(int.MaxValue, int.MinValue), TextFormatFlags.NoPadding); 
     this.Size = new Size(Padding.Left + textSize.Width + 5 + IndicatorSize.Width + Padding.Right, 
           Padding.Top + Math.Max(textSize.Height, IndicatorSize.Height) + Padding.Bottom); 
     Point textStart = new Point(Padding.Left, (this.Size.Height-textSize.Height)/2); 
     Rectangle textBounds = new Rectangle(textStart, textSize) ; 
     Brush indicatorBrush = new SolidBrush(indicatorColor) ; 
     Point indicatorStart = new Point(textStart.X + textSize.Width + 5, (this.Size.Height-IndicatorSize.Height)/2) ; 
     Rectangle indicatorBounds = new Rectangle(indicatorStart, IndicatorSize) ; 

     e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
     TextRenderer.DrawText(e.Graphics, statusText, Font, textBounds, ForeColor, TextFormatFlags.NoPadding); 
     e.Graphics.FillEllipse(indicatorBrush, indicatorBounds); 
    } 
} 

bande d'outils de contrôle de code hôte:

[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.All)] 
public class ToolStripServiceStatus : ToolStripControlHost 
{ 
    public ToolStripServiceStatus() 
     : base(new ServiceStatus()) 
    { 
    } 
} 
+0

Pour héberger votre UC ne devriez-vous pas le passer dans l'hôte via le constructeur? 'public ToolStripServiceStatus (ServiceStatus sStatus)' – TaW

+0

@Taw, il est passé au constructeur de la classe de base – tdemay

Répondre

0

J'étais trop réfléchir. ToolStripStatusLabel possède des propriétés de texte et d'image.

[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.All)] 
public class ToolStripServiceStatus : ToolStripStatusLabel 
{ 
    Timer _statusRefresh = null; 
    public ToolStripServiceStatus() : base() 
    { 
     this.TextImageRelation = System.Windows.Forms.TextImageRelation.TextBeforeImage; 
     RefreshStatus(); 
    } 

    void _statusRefresh_Tick(object sender, EventArgs e) 
    { 
     RefreshStatus(); 
    } 

    public ServiceControllerStatus GetStatus() 
    { 
     using (var service = new ServiceController("MyService")) 
     { 
      return service.Status; 
     } 
    } 
    public ServiceControllerStatus GetStatusInfo(out string statusText, out Color indicatorColor) 
    { 
     ServiceControllerStatus status = default(ServiceControllerStatus); 
     try 
     { 
      status = GetStatus(); 
      switch (status) 
      { 
       case ServiceControllerStatus.ContinuePending: 
        statusText = Properties.Resources.SERVICE_CONTINUE_PENDING; 
        indicatorColor = Color.Yellow; 
        break; 
       case ServiceControllerStatus.Paused: 
        statusText = Properties.Resources.SERVICE_PAUSED; 
        indicatorColor = Color.Yellow; 
        break; 
       case ServiceControllerStatus.PausePending: 
        statusText = Properties.Resources.SERVICE_PAUSE_PENDING; 
        indicatorColor = Color.Yellow; 
        break; 
       case ServiceControllerStatus.Running: 
        statusText = Properties.Resources.SERVICE_RUNNING; 
        indicatorColor = Color.Green; 
        break; 
       case ServiceControllerStatus.StartPending: 
        statusText = Properties.Resources.SERVICE_START_PENDING; 
        indicatorColor = Color.Yellow; 
        break; 
       case ServiceControllerStatus.Stopped: 
        statusText = Properties.Resources.SERVICE_STOPPED; 
        indicatorColor = Color.Red; 
        break; 
       case ServiceControllerStatus.StopPending: 
        statusText = Properties.Resources.SERVICE_STOP_PENDING; 
        indicatorColor = Color.Yellow; 
        break; 
       default: 
        statusText = default(String); 
        indicatorColor = default(Color); 
        break; 
      } 
     } 
     catch 
     { 
      statusText = Properties.Resources.SERVICE_CANNOT_CONNECT; 
      indicatorColor = Color.Red; 
     } 
     return status; 
    } 

    string _previousStatusText = ""; 
    public ServiceControllerStatus RefreshStatus() 
    { 
     if (_statusRefresh == null) 
     { 
      _statusRefresh = new Timer() { Interval = 1000 }; 
      _statusRefresh.Tick += new EventHandler(_statusRefresh_Tick); 
     } 
     _statusRefresh.Enabled = false; 
     string statusText; 
     Color indicatorColor; 
     ServiceControllerStatus status = GetStatusInfo(out statusText, out indicatorColor); 

     if (_previousStatusText != statusText) 
     { 
      Text = statusText; 
      Image bmp = new Bitmap(Height, Height); 
      using (Graphics g = Graphics.FromImage(bmp)) 
      { 
       g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 
       g.FillEllipse(new SolidBrush(indicatorColor), new Rectangle(0, 0, Height - 1, Height - 1)); 
      } 
      this.Image = bmp; 
     } 
     _statusRefresh.Enabled = (status != ServiceControllerStatus.Stopped && status != ServiceControllerStatus.Running && status != ServiceControllerStatus.Paused); 
     return status; 
    } 
}