0

我正在为 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 毫秒,然后就做到了。非常感谢大家。

4

2 回答 2

2

如果您以 1 秒的间隔计时,那么您实际上也有 1 秒的误差范围,因此调度程序队列只需要保留一小段时间,以便从显示中减少一秒。你最好以更高的频率运行你的计时器,这样你就有更少的错误窗口,并且做更少的工作,因为你会被如此频繁地调用。

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

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

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

在哪里

Public int MySeconds { set { // 仅当第二个实际发生变化时 if (_mySeconds != value) { _mySeconds = value; NotifyPropertyChanged(...); } } }

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

于 2012-11-21T17:46:27.500 回答
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

于 2012-11-21T14:43:30.267 回答