切换PictureBoxes

时间:2012-08-15 10:45:26

标签: c# winforms

在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项服务我会检查并认为这对于服务名称旁边的小图标来说有点多了。我是在迷恋吗?它不是那么大的交易,不会让我的代码像我想的那样草率吗?有更简单或更好的方法吗?

3 个答案:

答案 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#不会创建图像的额外副本,因此以这种方式使用它们是完全正常的。或者自己绘制整个控件,为每个服务绘制图片,同时只使用一个控件(或整个窗口)作为画布。