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 ミリ秒に短縮したところ、それで完了しました。どうもありがとうございました。