如何在WFA的中心对齐tableLayoutPanel

时间:2018-12-23 13:26:20

标签: c# winforms label alignment tablelayoutpanel

我目前正在编码除夕的倒数计时,每当倒计时发生变化时,我都会更新标签。我已经完成了所有功能,并且运行良好,因此我正在布局和清理代码,这导致了我的问题:

每当倒计时更新时,标签将闪烁,因为其内容被更改。我想在投影仪上运行倒计时(表单将在全屏模式下运行),因此我不希望整个标签都闪烁,因为看一些每秒闪烁的白色文本不会很好。这就是为什么我希望小时,分钟和秒是独立的标签,这些标签贴在我的WFA中心。

我现在正在使用的是tableLayoutPanel,它想在表单中间对齐,但是每当更改tableLayoutPanel.Dock属性时,它都不会在表单中心对齐。我正在测试是否可以通过使用内部宽度和高度来对齐面板,但是在我看来,这并不是使用它们的好方法。

没有特定的代码,它基本上是一个五列的tableLayoutPanel,中间有三个2位数字和2个冒号,但是如果需要进一步的建议,我可以发布整个倒计时代码。     编辑:这是我用来更新标签以及如何获取当前时间以及剩余时间的信息的代码:

private void timerCountdown_Tick(object sender, EventArgs 
{
    GetCurrentTime();
    lCountdown.Text = GetLeftTime();
    PlayMusic();
}

    private void GetCurrentTime()
{
    string time = DateTime.Now.TimeOfDay.ToString();
    string[] timeSplit = time.Split(':');
    int i = 0;
    foreach (string word in timeSplit)
    {
        i++;
        switch (i)
        {
            default:
                return;
            case 1:
                Int32.TryParse(word, out iCurrentHours);
                break;
            case 2:
                Int32.TryParse(word, out iCurrentMinutes);
                break;
            case 3:
                string[] sSeconds = word.Split('.');
                int[] iSeconds = new int[2];
                Int32.TryParse(sSeconds[0], out iSeconds[0]);
                Int32.TryParse(sSeconds[1], out iSeconds[1]);
                if (iSeconds[1] < 5)
                    iCurrentSeconds = iSeconds[0];
                else if(iSeconds[1] >= 5)
                    iCurrentSeconds = iSeconds[0] + 1;
                break;
         }
    }
}

private string GetLeftTime()
{
    int hours = 24, minutes = 60, seconds = 60;
    return  (hours - GetCurrentHours() - 1).ToString() + ":" + 
            (minutes - GetCurrentMinutes() - 1).ToString() + ":" +
            (seconds - GetCurrentSeconds()).ToString();
}

如果有人可以向我解释我做错了什么,还有其他可以用来对齐五个标签的元素(小时+“:” +分钟+“:” +秒),这将对我有很大帮助

1 个答案:

答案 0 :(得分:0)

您正在使用字符串执行DateTime计算和不必要的解析。
可以使用.Net DateTimeTimeSpan类简化所有这些过程,这两个类提供了执行Date和Time方法的方法,并且可以从.net中提取每个Date和Time组件(年,小时,秒等)。计算的时间跨度。

可以使用DateTime类来定义当前年份的最后一秒:

DateTime LastDayOfYear = new DateTime(DateTime.Now.Year, 12, 31, 23, 59, 59);

倒数计时剩余时间可以是:

TimeSpan CountDown = LastDayOfYear - DateTime.Now;

然后可以使用插值来格式化要打印的字符串:

CountDownFormat = $"{(int)CountDown.TotalHours:#00} : {CountDown.Minutes:00} : {CountDown.Seconds:00}";

然后,我建议您使用Form.Paint事件提供的e.Graphics对象打印格式化的倒计时时间。您不需要更新控件,字体大小的描述更容易执行和执行:

StringFormat format = new StringFormat(StringFormatFlags.NoClip | StringFormatFlags.NoWrap)
{
    Alignment = StringAlignment.Center,
    LineAlignment = StringAlignment.Center
};

private void CountDown_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
    using (Brush brush = new SolidBrush(this.ForeColor))
    {
        e.Graphics.DrawString(CountDownFormat, this.Font, brush, this.ClientRectangle, format);
    }
}

这是视觉结果的示例:

New Year's Eve Count Down


我已经准备好sample Project you can download from Google Drive来测试这些功能。如果您从未使用过这种方法,则可以更轻松地了解它如何进行测试。

注意:在运行时按键盘的 Control 键访问表单上的设置面板。