4

我不知道为什么这个暂停按钮在这里不起作用。我的秒表类也没有 Restart 方法,所以我想通过结合“reset and start”来编写它。还有什么想法吗?或者关于如何使这个暂停按钮起作用的任何想法?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Windows.Threading;
using System.Diagnostics;

namespace PhoneApp2
{
    public partial class MainPage : PhoneApplicationPage
    {
        Stopwatch sw = new Stopwatch();
        DispatcherTimer newTimer = new DispatcherTimer();

        enum TimerState
        {
            Unknown,
            Stopped,
            Paused,
            Running
        }

        private TimerState _currentState = TimerState.Unknown;

        public MainPage()
        {
            InitializeComponent();

            newTimer.Interval = TimeSpan.FromMilliseconds(1000 / 30);
            newTimer.Tick += OnTimerTick;
        }


        void OnTimerTick(object sender, EventArgs args)
        {
            UpdateUI();
        }

        private void Button_Stop(object sender, RoutedEventArgs e)
        {
            Stop();
        }

        private void Button_Pause(object sender, RoutedEventArgs e)
        {
            Pause();
        }

        private void Button_Start(object sender, RoutedEventArgs e)
        {


            Start();

        }
        void UpdateUI()
        {
            textClock.Text = sw.ElapsedMilliseconds.ToString("0.00");
        }


        void Start()
        {
            sw.Reset();
            sw.Start();
            newTimer.Start();
            UpdateUI();
        }

        void Stop()
        {
            _currentState = TimerState.Stopped;
            sw.Stop();
            newTimer.Stop();
            UpdateUI();
        }

        void Pause()
        {
            _currentState = TimerState.Paused;
            sw.Stop();
            newTimer.Stop();
            UpdateUI();
        }

        void Resume()
        {
            if (_currentState == TimerState.Stopped)
            {
                sw.Reset();
            }
            _currentState = TimerState.Running;
            sw.Start();
            newTimer.Start();
            UpdateUI();
        }
    }
}

谢谢。PS:我的 .NET 版本是“版本 4.5.50709”Microsoft Visual Studio Express 2012 for Windows Phone。根据此链接,我们应该在 Stopwatch 类中有一个 Restart 方法,但我的却没有!

4

2 回答 2

3

如果您的目标是 Windows Phone,那么您可能使用的是 Silverlight 而不是 .NET 4.5,这可以解释为什么您的Stopwatch类没有Restart方法。

在 Silverlight 中,Stopwatch.Start()将开始或恢复测量间隔的经过时间。

Start您的、和方法中的逻辑看起来没问题(*),但您只有 、 和 的Stop事件处理程序。没有。PauseResumeButton_StartButton_StopButton_PauseButton_Resume

你有恢复按钮吗?如果没有,您希望在哪里Resume调用您的方法?也许您已经将恢复按钮连接到Button_Start处理程序,它将重置您的秒表?

如果您没有 Resume 按钮,并且您希望 Start 按钮在暂停后恢复并在停止后重新启动,那么只需将 Start 按钮的点击事件处理程序更改为 callResume()而不是Start().

private void Button_Start(object sender, RoutedEventArgs e)
{
    Resume();
}

(*) 但是,您可能希望在秒表未运行时禁用停止/暂停,因为您可以按停止,然后暂停,然后当您按开始时,计时器将恢复而不是重新启动等。

于 2013-09-10T03:33:05.493 回答
1

为了暂停/恢复DispatcherTimer,您需要使用该.IsEnabled属性。Restart方法缺少与您正在使用的框架相关的原因。这不是完整的 .Net 框架,只是它的一个子集。正是@Ergwun 所说的。

于 2013-09-10T03:50:51.850 回答