在我的WIndows 8数字时钟应用程序中跳过秒

时间:2012-11-21 13:56:58

标签: c# xaml windows-8 windows-runtime

我正在为Windows 8 app开发数字时钟。

奇怪的是,每分钟都会跳过一些随机的秒。我不确定为什么会这样。我的一个猜测是它可能是因为有时候检索那个自定义的第二个图像需要花费一秒多的时间,因此下一秒会被跳过。

这是我在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毫秒。非常感谢大家。

2 个答案:

答案 0 :(得分:2)

如果你以1秒的间隔记录你的计时器,那么你实际上也有1秒的误差幅度,因此调度员队列只需要保持一小段时间以便从被显示。你可能最好以更高的频率运行你的计时器,这样你就可以减少错误的窗口,并减少工作量,因为你会被频繁调用。

例如,如果您运行计时器每0.1秒或100毫秒勾选一次,那么您可以每秒更新秒数10秒,然后仅在显示的值实际更改时绘制屏幕更新。

例如,在一个只显示我们可以做的秒数的时钟中;

Public void timer_tick(...) {   MySeconds = DateTime.Now.Seconds: }

其中

Public int MySeconds {   组   {     //只有第二个实际发生了变化     if(_mySeconds!= value)    {       _mySeconds = value;       NotifyPropertyChanged(...);     }   } }

诀窍是在每个阶段尽可能少地做。

答案 1 :(得分:1)

尝试使用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