0

Windows 8 アプリ用のデジタル時計を開発しています。

そして奇妙なことに、ランダムな秒が毎分スキップされています。なぜそれが起こっているのかわかりません。私の推測の 1 つは、カスタムの 2 番目のイメージを取得するのに 1 秒以上かかることがあり、次の 1 秒がスキップされることがあるからかもしれません。

これは 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 秒の誤差の範囲もあり、したがってディスパッチャ キューを保持する必要があるのは、表示から 1 秒を落とすために短い時間だけです。タイマーをより高い頻度で実行して、エラーのウィンドウを少なくし、頻繁に呼び出されるため、作業を減らす方がよい場合があります。

たとえば、タイマーを実行して 0.1 秒または 100 ミリ秒ごとに刻む場合、1 秒間に 10 回まで秒を更新し、表示する値が実際に変化したときにのみ画面の更新を描画できます。

たとえば、秒しか表示しない時計では、次のことができます。

Public 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 に答える