Xamarin中点击计圈按钮时在五个标签依次显示单圈耗时的问题
Xamarin秒表计圈功能修复方案
你的问题出在每次点击计圈按钮时,都会先强制覆盖displayLaps1的内容,导致后续的判断逻辑完全混乱——第二次点击时,displayLaps1永远不为空,同时又会触发displayLaps2的赋值,最终两个标签都会被设置成当前总耗时,且之前的计圈数据被覆盖。
修复方案1:顺序判断空标签(直接修改原代码)
去掉每次先给displayLaps1赋值的代码,改为按顺序检查第一个空的标签并赋值:
private void lapButton_Clicked(object sender, EventArgs e) { TimeSpan ts = stopWatch.Elapsed; // 使用你定义好的格式化字符串,比直接ToString()更美观 string elapsedTime = string.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10); // 按顺序查找第一个空标签,赋值后停止判断 if (string.IsNullOrEmpty(displayLaps1.Text)) { displayLaps1.Text = elapsedTime; } else if (string.IsNullOrEmpty(displayLaps2.Text)) { displayLaps2.Text = elapsedTime; } else if (string.IsNullOrEmpty(displayLaps3.Text)) { displayLaps3.Text = elapsedTime; } else if (string.IsNullOrEmpty(displayLaps4.Text)) { displayLaps4.Text = elapsedTime; } else if (string.IsNullOrEmpty(displayLaps5.Text)) { displayLaps5.Text = elapsedTime; } }
修复方案2:用数组管理标签(更简洁易维护)
把所有计圈标签放到数组里,遍历数组找第一个空标签赋值,后续增加计圈数只需修改数组即可:
// 在页面类中定义数组,可在构造函数或初始化方法中赋值 private Label[] _lapLabels; // 示例初始化(比如在Page构造函数里) public YourPage() { InitializeComponent(); _lapLabels = new Label[] { displayLaps1, displayLaps2, displayLaps3, displayLaps4, displayLaps5 }; } private void lapButton_Clicked(object sender, EventArgs e) { TimeSpan ts = stopWatch.Elapsed; string elapsedTime = string.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10); // 遍历数组找第一个空标签 foreach (var label in _lapLabels) { if (string.IsNullOrEmpty(label.Text)) { label.Text = elapsedTime; break; // 找到后立即退出循环 } } }
额外优化:显示每圈实际耗时(而非总时间)
如果需要显示每一圈的单独耗时(不是从开始到当前的总时长),可添加变量记录上一次计圈的时间:
private TimeSpan _lastLapTime = TimeSpan.Zero; private void lapButton_Clicked(object sender, EventArgs e) { TimeSpan currentTotalTime = stopWatch.Elapsed; // 计算当前圈的耗时:当前总时间 - 上一次计圈时间 TimeSpan currentLapTime = currentTotalTime - _lastLapTime; string lapTimeStr = string.Format("{0:00}:{1:00}:{2:00}.{3:00}", currentLapTime.Hours, currentLapTime.Minutes, currentLapTime.Seconds, currentLapTime.Milliseconds / 10); // 用方案1或方案2的逻辑赋值到空标签 if (string.IsNullOrEmpty(displayLaps1.Text)) { displayLaps1.Text = lapTimeStr; } else if (string.IsNullOrEmpty(displayLaps2.Text)) { displayLaps2.Text = lapTimeStr; } // ... 后续标签判断 // 更新上一次计圈时间 _lastLapTime = currentTotalTime; }
内容的提问来源于stack exchange,提问作者Mariah Thomas
相关产品推荐
相关产品推荐

