C#标签突出显示并删除突出显示

时间:2016-03-09 23:26:30

标签: c# winforms

我确定这很容易理解,但我不能这样做。我在Label内有一个3 Panel的winform。加载表单时,第一个Label有一个Paint事件,在其上绘制一个矩形。我希望backgroundWorker遍历每一个,等待5秒,将Label恢复正常(重绘我猜测),然后在以下Label上绘制一个矩形。

public List<Label> GetLabelList()
        {
            return new List<List>()
            {
                label1,
                label2,
                label3,
                label4
            };
        }

private void bgBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        var getList = GetLabelList();

        for (int i = 0; i < getList.Count; i++)
        {
            if ((bgBackgroundWorker.CancellationPending == true))
            {
                e.Cancel = true;
                break;
            }

            else
            {
                Thread.Sleep(5000);
                getList [i].Paint += RemoveLabelHighlight;
                getList [i].Invalidate();

                if (i < 2)
                {
                    getList [i + 1].Paint += AddLabelHighlight;
                    getList [i + 1].Invalidate();
                }

                bgBackgroundWorker.ReportProgress((i * 10));
            }
        }
    }

private void AddLabelHighlight(object sender, PaintEventArgs e)
    {
        var label = sender as Label;
        e.Graphics.DrawRectangle(new Pen(Color.DeepPink, 8), label.ClientRectangle);
    }

    private void RemoveLabelHighlight(object sender, PaintEventArgs e)
    {
        var label = sender as Label; 
        e.Graphics.DrawRectangle(new Pen(Color.Green, 8), label.ClientRectangle); // This should return the Label back to original state
    }

这样可以工作,但绘制矩形时,标签会一直切断。有什么建议吗?

此外,我确信有更好,更有效的方法来实现这一点,可能是EventHandler或其他东西。如果可能的话,我想要一些建议。

1 个答案:

答案 0 :(得分:1)

这实际上是由于您使用了8像素的笔宽,我相信。尝试不同的尺寸,看看是否会改变未绘制的矩形的大小。

要填充矩形,请使用:

e.Graphics.FillRectangle(new SolidBrush(Color.DeepPink), e.ClipRectangle);

编辑由于您现在完全负责绘制控件,因此可以使用DrawString调用重新绘制文本:

e.Graphics.DrawString(label.Text, label.Font, SystemBrushes.ControlText, new PointF(0,0));

编辑以下是如何嵌套面板和标签以实现您的目标:

  • 添加一个新面板,将填充设置为8,8,8,8,将BackColor设置为您喜欢的颜色
  • 向此面板添加新标签,将其AutoSize属性设置为false,将Dock属性设置为Fill,将TextAlign属性设置为MiddleCenter

虽然我一直喜欢做自己绘制的东西,但有时它更容易使用那里的东西!但是为了好玩,我会将它包装成一个新的Panel派生控件,以便于重用。