1

WPFのタイマーについて疑問に思っています。

私が基本的に知っているのは、次のコードのように単純なカウントダウンタイマー(ラベル)をカウントダウンする方法です:

private void buttonStartOne_Click(object sender, RoutedEventArgs e)
{
    counterOne = new DispatcherTimer();
    counterOne.Tick += new EventHandler(counterOne_Tick);
    counterOne.Interval = new TimeSpan(0, 0, 1);

    counterOneTime = 10;
    counterOne.Start();
}

private void counterOne_Tick(object sender, EventArgs e)
{
// code goes here

    if (counterOneTime > 0)
    {
        counterOneTime--;
        labelCounterOne.Content = counterOneTime + "s";
    }
    else
        counterOne.Stop();
}

上記のサンプル コードでは、カウントダウンはわずか 10 秒です。私が欲しいのですが、わからないのは、HH:mm:ss として作成し、カウントダウンするよりもどうすればよいかということです。3 つの個別のカウンターとラベル (時間単位ごとに 1 つ) でそれを行いますか? または、これに取り組むためのより良い方法は何ですか?

4

2 に答える 2

4

ToString(string format)メソッドを使用Timespanして文字列に変換できます。結果の文字列をラベルに設定します

于 2012-04-03T21:33:55.167 に答える
1
public class TimeController
{
    private static readonly TimeSpan TimeSpan = new TimeSpan(0, 0, 1);
    private static int _time;

    protected static readonly DispatcherTimer Timer = new DispatcherTimer();
    protected static readonly DispatcherTimer BeeperTimer = new DispatcherTimer();
    protected static readonly Stopwatch StopWatch = new Stopwatch();
    protected static Label TimerLabel;
    protected static Button StartButton;

    internal static int Time { get { return _time; } set { _time = value; ExtractAndUpdate(); } }
    internal static bool Countdown { get; set; }

    /// <summary>
    /// Static constructor
    /// </summary>
    static TimeController()
    {
        BeeperTimer.Interval = TimeSpan;
        BeeperTimer.Tick += BeeperTick;
        Timer.Interval = TimeSpan;
        Timer.Tick += TimerTick;
    }

    /// <summary>
    /// Timer tick event method
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private static void TimerTick(object sender, EventArgs e)
    {
        if (Countdown)
            if (Time > 0)
            {
                ExtractAndUpdate();
                Time -= 1;
            }
            else
            {
                StopRunning();
                BeeperTimer.Start();
            }
        else
            ExtractAndUpdate();
    }

    /// <summary>
    /// Start timer and stopwatch
    /// </summary>
    protected static void StartRunning()
    {
        Timer.Start();
        StopWatch.Start();
        StartButton.Content = Labels.Pause;
    }

    /// <summary>
    /// Stop timer and stopwatch
    /// </summary>
    protected static void StopRunning()
    {
        Timer.Stop();
        StopWatch.Stop();
        StartButton.Content = Labels.Start;
    }

    /// <summary>
    /// Beeper event method and label blinking
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private static void BeeperTick(object sender, EventArgs e)
    {
        TimerLabel.Visibility = TimerLabel.Visibility.Equals(Visibility.Hidden) ? Visibility.Visible : Visibility.Hidden;
        Console.Beep();
    }

    /// <summary>
    /// Extract time and update label
    /// </summary>
    private static void ExtractAndUpdate()
    {
        var elapsed = Countdown ? ConvertToTimeSpan() : StopWatch.Elapsed;
        UpdateTimeLabel(elapsed);
    }

    /// <summary>
    /// Convert int to TimeSpan
    /// </summary>
    /// <returns></returns>
    internal static TimeSpan ConvertToTimeSpan()
    {
        var hours = Time / 3600;
        var minutes = (Time % 3600) / 60;
        var seconds = Time % 60;
        return new TimeSpan(hours, minutes, seconds);
    }

    /// <summary>
    /// Update label with data and change color
    /// </summary>
    /// <param name="elapsed"></param>
    protected static void UpdateTimeLabel(TimeSpan elapsed)
    {
        TimerLabel.Foreground = Brushes.Black;
        var time = String.Format(CultureInfo.CurrentCulture, "{0:00h} {1:00m} {2:00s}", elapsed.Hours, elapsed.Minutes, elapsed.Seconds);
        if (Countdown && elapsed.TotalMinutes < 1)
            TimerLabel.Foreground = Brushes.Red;
        TimerLabel.Content = time;
    }
}
于 2012-04-03T21:36:46.803 に答える