我正在为Windows8应用程序开发一个数字时钟。
奇怪的是,每一分钟都有一些随机的秒被跳过。我不确定为什么会发生这种情况。我的猜测之一是,这可能是因为有时检索自定义的第二张图像需要花费超过一秒的时间,因此下一秒会被跳过。
这是我用XAML编写的代码
<!-- second -->
<Grid Grid.Row="1" VerticalAlignment="Bottom" HorizontalAlignment="Left" Margin="-15,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Image Grid.Column="0"
Source="{Binding CurrentTime, Converter={StaticResource ThemeTimeConverterSecondDigit1}}" Opacity="0.99" Stretch="None" />
<Image Grid.Column="1"
Source="{Binding CurrentTime, Converter={StaticResource ThemeTimeConverterSecondDigit2}}" Opacity="0.99" Stretch="None" Margin="-30,0,0,0" />
</Grid>绑定变量Current time提供了时间,我使用一个转换器来获取该时间的自定义图像。
这是我的转换器的代码
public object Convert(object value, Type targetType, object parameter, string language)
{
if (!(value is DateTime))
{
return value;
}
System.DateTime currentDate = DateTime.Now;
var dt = (DateTime)value;
var timePeriod = dt.ToString("tt ").StartsWith("A") ? TimePeriod.AM : TimePeriod.PM;
if (!this.IsTwentyFourHour && dt.Hour > 12)
{
dt = dt.Subtract(TimeSpan.FromHours(12));
}
switch (this.Component)
{
case ThemeComponents.SecondDigit1:
{
var sec = _GetFirstDigit(dt.Second);
return this.CurrentTheme.SmallDigits.Where(d => d.Value == sec).First().Image;
}
case ThemeComponents.SecondDigit2:
{
var sec = _GetSecondDigit(dt.Second);
return this.CurrentTheme.SmallDigits.Where(d => d.Value == sec).First().Image;
}
}
private int _GetFirstDigit(int number)
{
if (number >= 10)
{
return System.Convert.ToInt32(number.ToString().Substring(0, 1));
}
return 0;
}
private int _GetSecondDigit(int number)
{
if (number >= 10)
{
return System.Convert.ToInt32(number.ToString().Substring(1, 1));
}
return System.Convert.ToInt32(number.ToString().Substring(0, 1));
}请给我你的看法,为什么这可能会发生,或者如果你有任何更好的方法来实现它。谢谢
编辑:
我用文本块替换了图像,只给出了简单的数字,但它仍然在发生。仍在跳过秒数
编辑:这是设置当前时间的代码
var timeoutputShown = false;
_ClockTimer = new DispatcherTimer();
_ClockTimer.Interval = TimeSpan.FromMilliseconds(1000);
_ClockTimer.Tick += (s, e) =>
{
App.ViewModel.CurrentTime = DateTime.Now;
if (!timeoutputShown)
{
timeoutputShown = true;
//ShowTimePanelStoryboard.Begin();
}
};答案:
我将间隔从1000ms减少到100ms,就这样做了。非常感谢大家。
发布于 2012-11-22 01:46:28
如果您的计时器以1秒为间隔计时,那么您实际上也有1秒的误差,因此,只需保持调度程序队列一小段时间,就可以使显示的时间减少一秒。你最好以更高的频率运行你的计时器,这样你就有更少的出错窗口,并且因为你将被频繁地调用,所以你做的工作也会更少。
例如,如果您运行计时器,每0.1秒或100毫秒计时一次,那么您可以将秒数更新到每秒10次,然后仅在要显示的值实际发生变化时绘制屏幕更新。
例如,在一个只显示秒的时钟中,我们可以做;
公共空timer_tick(...) { MySeconds = DateTime.Now.Seconds:}
哪里
Public int值{ set { //仅当(_mySeconds != MySeconds ){ _mySeconds = value;NotifyPropertyChanged(...);}}第二个值实际发生更改时才设置}
诀窍是在每个阶段做尽可能少的事情。
发布于 2012-11-21 22:43:30
尝试使用DispatcherTimer触发更新时钟时间的事件。
public void startTimer()
{
DispatcherTimer timer = new DispatcherTimer();
//Fire the Tick event every second
timer.Interval = new TimeSpan(0, 0, 1);
timer.Tick += timer_Tick();
timer.Start();
}
void timer_Tick(object sender, object e)
{
//Do whatever you want ex, refresh the time and show it in an label
}也许创建自定义字体、设置标签样式并使用该组合来显示时钟也会更好。
有关DispatcherTimer的更多信息,请访问:http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.dispatchertimer.aspx
https://stackoverflow.com/questions/13494846
复制相似问题