Как сделать цикл для таймера в UWP - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь закодировать таймер в UWP. Я хочу, чтобы мой таймер сделал цикл, который отсчитывает, например, 1 минуту, а затем отсчитывает 2-минутную паузу, все это 5 раз подряд, без необходимости повторного нажатия кнопки запуска. Я могу отсчитать 1 минуту и ​​войти в 2-минутную паузу, но не могу понять, как вернуться к 1-минутному отсчету. Цикл просто застрял в 2-минутной паузе.

Я пытался сделать IF, иначе. Я пробовал bool, правда, ложь ..

 public sealed partial class MainPage : Page
    {

         public int x;


        static FenetreParametres infopage = FenetreParametres.Current;
        static int Task = Int32.Parse(infopage.getTmpRound());
        //static int nb = Int32.Parse(infopage.getNbRound());
        //static int pause = Int32.Parse(infopage.getTmpPause());
        MediaPlayer player;

    private int _restsTaken { get; set; }
        private int _currentTime { get; set; }
        private DispatcherTimer _timer { get; set; }
        private TimeSpan _tickInterval { get; set; }
        private TimeSpan _intervalRemainingTime { get; set; }
        private DateTime _intervalEnd { get; set; }
        private bool _isRunning = false;

        private bool verif = false;

        public MainPage()
        {
            this.InitializeComponent();            
            _currentTime = 0;
            _tickInterval = TimeSpan.FromSeconds(1);
            this.initializeTimer(_tickInterval.Seconds);


            this.initializeDisplayTimer(0);
            player = new MediaPlayer();

        }

        private void initializeTimer(int tickInterval)
        {
            _timer = new DispatcherTimer();
            _timer.Interval = TimeSpan.FromSeconds(tickInterval);
            _timer.Tick += interval_Tick;
        }

        private void initializeDisplayTimer(int intervalTime)
        {
            _intervalRemainingTime = TimeSpan.FromMinutes(intervalTime);
            timerLabel.Text = _intervalRemainingTime.ToString();
        }

        private void interval_Tick(object sender, object e)
        {

            int previousTimeInMinutes = _intervalRemainingTime.Minutes;
            _isRunning = true;
            _intervalRemainingTime = _intervalRemainingTime.Subtract(_tickInterval);
            timerLabel.Text = _intervalRemainingTime.ToString();

            if (previousTimeInMinutes != _intervalRemainingTime.Minutes)
            {
                string timeIndicator = _intervalRemainingTime.Minutes == 0 ? "1 >" : _intervalRemainingTime.Minutes.ToString();

            }
            if (TimeSpan.Equals(_intervalRemainingTime, TimeSpan.Zero))
            {
                playmusic();
                this.initializeDisplayTimer(2);



            }

        }

        private async void playmusic()
        {
            Windows.Storage.StorageFolder folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(@"Assets");
            Windows.Storage.StorageFile file = await folder.GetFileAsync("ding.wav");

            player.AutoPlay = false;
            player.Source = MediaSource.CreateFromStorageFile(file);

            player.Play();
        }

        private void trait()
        {

            for (int i = 1; i <= 3; i++)
            {
                //timerLabel.Text = "Pause";
                //x = duree;
                playmusic();
                _currentTime = x;
                this.initializeDisplayTimer(_currentTime);
                x--;
                _intervalEnd = DateTime.Now.Add(_intervalRemainingTime);

                _timer.Start();


            }

        }

        private void Button_Click_Start(object sender, RoutedEventArgs e)
        {

            if (TimeSpan.Equals(_intervalRemainingTime, TimeSpan.Zero))
            {
                playmusic();
                this.initializeDisplayTimer(Task);
                _timer.Start();
            }

        }

        private void Button_Click_Pause(object sender, RoutedEventArgs e)
        {
            _isRunning = false;
            _timer.Stop();

        }

        private void Button_Click_Reset(object sender, RoutedEventArgs e)
        {
            _timer.Stop();

            this.initializeDisplayTimer(_currentTime);
        }
}

Ожидается, что он перейдет в паузу на 2 минуты, а затем вернется к обратному отсчету в 1 минуту, 5 раз подряд

1 Ответ

0 голосов
/ 27 мая 2019

Ваш вопрос на самом деле является основной проблемой логики кода C #. Это не относится к программированию UWP. Если вы четко понимаете всю логику, легко получить цель с помощью логики кода C #.

Я только что сделал простой пример кода для вашей справки:

<Grid>
    <Grid.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="VerticalAlignment" Value="Center"></Setter>
        </Style>
    </Grid.Resources>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <TextBlock Grid.Column="0" Text="Count Down Time: "></TextBlock>
    <TextBlock x:Name="countDown1" Grid.Column="1"></TextBlock>
    <TextBlock Grid.Row="1" Grid.Column="0" Text="Pause Remaning: "></TextBlock>
    <TextBlock x:Name="pauseRemaning" Grid.Row="1" Grid.Column="1"></TextBlock>
    <TextBlock Grid.Row="2" Grid.Column="0" Text="Looping Times: "></TextBlock>
    <TextBlock x:Name="loop_Times" Grid.Row="2" Grid.Column="1"></TextBlock>
</Grid>
public sealed partial class MainPage : Page
{
    private int countDowm = 60;
    private int RemainingTime = 120;
    private int loopTimes = 0;

    public MainPage()
    {
        this.InitializeComponent();
        DispatcherTimer timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += Timer_Tick;
        timer.Start();
    }

    private void Timer_Tick(object sender, object e)
    {
        if (loopTimes == 5)
        {
            countDowm = 60;
            RemainingTime = 120;
            loopTimes = 0;
        }
        else
        {
            if (countDowm <= 0)
            {
                if (RemainingTime <= 0)
                {
                    loopTimes++;
                    countDowm = 60;
                    RemainingTime = 120;
                }
                else
                {
                    RemainingTime--;
                }
            }
            else
            {
                countDowm--;
            }
        }

        countDown1.Text = countDowm.ToString();
        pauseRemaning.Text = RemainingTime.ToString();
        loop_Times.Text = loopTimes.ToString();
    }
}
...