我正在为 Windows 8 应用程序开发一个数字时钟。
奇怪的是,每分钟都会跳过一些随机秒。我不确定为什么会这样。我的一个猜测是,这可能是因为有时要检索该自定义第二张图像需要超过一秒钟,因此下一秒会被跳过。
这是我在 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();
}
};
回答:
我将间隔从 1000 毫秒减少到 100 毫秒,然后就做到了。非常感谢大家。