在Windows窗体上,我正在尝试使用PictureBoxes作为状态图标。我有4个用于Running,Stopped,StartPending和StopPending的图标。我不确定如何最好地做到这一点,所以我决定将它们叠加在一起,只做一个有效可见的那个。我想出了类似的东西。
switch (currentServiceStatus)
{
case "Running":
pb_startedTestService.Visible = true;
pb_startingTestService.Visible = false;
pb_stoppedTestService.Visible = false;
pb_stoppingTestService.Visible = false;
break;
case "StartPending":
pb_startedTestService.Visible = false;
pb_startingTestService.Visible = true;
pb_stoppedTestService.Visible = false;
pb_stoppingTestService.Visible = false;
break;
case "Stopped":
pb_startedTestService.Visible = false;
pb_startingTestService.Visible = false;
pb_stoppedTestService.Visible = true;
pb_stoppingTestService.Visible = false;
break;
case "StopPending":
pb_startedTestService.Visible = false;
pb_startingTestService.Visible = false;
pb_stoppedTestService.Visible = false;
pb_stoppingTestService.Visible = true;
break;
}
如果它只是一项服务,我很好,但至少有7项服务我会检查并认为这对于服务名称旁边的小图标来说有点多了。我是在迷恋吗?它不是那么大的交易,不会让我的代码像我想的那样草率吗?有更简单或更好的方法吗?
答案 0 :(得分:2)
为什么不使用一个PictureBox,在switch语句中只需更改正在显示的图像。 IE:PictureBox1.Image = ...
假设您已将图片加载到资源中,以下是访问它们的语法。
PictureBox1.Image = global::(Namespace).Properties.Resources.(PictureName);
答案 1 :(得分:1)
尝试设置PictureBox.Image
属性:
我使用了Dictionary
集合,可能需要使用Properties.Resources
在运行时访问资源:
var imageDic = new Dictionary<string, Image>
{
{"Running", Properties.Resources.YourImageName},
{"StartPending", new Bitmap("...")},
{"Stopped", new Bitmap("...")},
{"StopPending", new Bitmap("...")}
};
// and use it:
pb.Image = imageDic[currentServiceStatus];
或以你的方式:
Image imgRunning = ...;
Image imgStartPending = ...;
Image imgStopped = ...;
Image imgStopPending = ...;
switch (currentServiceStatus)
{
case "Running":
pb.Image = imgRunning;
break;
case "StartPending":
pb.Image = imgStartPending;
break;
case "Stopped":
pb.Image = imgStopped;
break;
case "StopPending":
pb.Image = imgStopPending;
break;
}
答案 2 :(得分:0)
每项服务仅使用一个图片框,并根据状态分配图像。 C#不会创建图像的额外副本,因此以这种方式使用它们是完全正常的。或者自己绘制整个控件,为每个服务绘制图片,同时只使用一个控件(或整个窗口)作为画布。