Rey21 Ответов: 1

Как я могу получить время после подсчета в течение 5 минут в форме xamarin


Я хочу попробовать сделать привязку Время2 показывают время после моего счетчика таймера в 5 минут, а теперь не знаю как его получить
Пример : время шоу 10.45 утра после того, как я нажмите кнопку Пуск и таймер закончил отсчет Время2 шоу 10.50 утра.
Не могли бы вы помочь мне, как его получить ?
Это мое кодирование:

MainViewModel.в CS
using GalaSoft.MvvmLight;
using System;
using System.Collections.Generic;
using System.Text;
using timer.Helpers;
using Xamarin.Forms;

namespace timer.ViewModel
{
    public class MainViewModel : ViewModelBase
    {
        private Timer _timer;

        private TimeSpan _totalSeconds = new TimeSpan(0, 0, 5, 00);
       

        public TimeSpan TotalSeconds
        {
            get { return _totalSeconds; }
            set { Set(ref _totalSeconds, value); }
        }

        public Command StartCommand { get; set; }
        public Command PauseCommand { get; set; }
        public Command StopCommand { get; set; }

        public string Time { get; }

        
        public string Time2 { get; set; }

        public MainViewModel()
        {
            StartCommand = new Command(StartTimerCommand);
            PauseCommand = new Command(PauseTimerCommand);
            StopCommand = new Command(StopTimerCommand);
            Time = DateTime.Now.ToString("hh:mm tt");
            Time2 = DateTime.Now.ToString("hh:mm tt");
            
            _timer = new Timer(TimeSpan.FromSeconds(1), CountDown);

            TotalSeconds = _totalSeconds;
        }

        

        private void StartTimerCommand()
        {
            _timer.Start();
            
            
        }

        private void CountDown()
        {
            if(_totalSeconds.TotalSeconds == 0)
            {
                StopTimerCommand();
            }
            else
            {
                TotalSeconds = _totalSeconds.Subtract(new TimeSpan(0, 0, 0, 1));
            }
        }

        private void PauseTimerCommand()
        {
            _timer.Stop();
        }

        private void StopTimerCommand()
        {
            TotalSeconds = new TimeSpan(0, 0, 0, 1);
            _timer.Stop();
        }

    }
}


Таймер.в CS
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using Xamarin.Forms;

namespace timer.Helpers
{
    public class Timer
    {
        private readonly TimeSpan _timespan;
        private readonly Action _callback;

        private static CancellationTokenSource _cancellationTokenSource;

        

        public Timer(TimeSpan timeSpan, Action callback)
        {
            _timespan = timeSpan;
            _callback = callback;
            _cancellationTokenSource = new CancellationTokenSource();
        }

        public void Start()
        {
            CancellationTokenSource cts = _cancellationTokenSource;

            Device.StartTimer(_timespan, () =>
            {
                if (cts.IsCancellationRequested)
                {
                    return false;
                }

                _callback.Invoke();
                return true;
            });

        }

        public void Stop()
        {
            Interlocked.Exchange(ref _cancellationTokenSource, new CancellationTokenSource()).Cancel();
        }
    }
}


Файл MainPage.язык XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:viewModel="clr-namespace:timer.ViewModel;assembly=timer"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="timer.MainPage">

    <ContentPage.BindingContext>
        <viewModel:MainViewModel></viewModel:MainViewModel>
    </ContentPage.BindingContext>

    <ContentPage.Content>
        <StackLayout
            Orientation="Vertical">
            <Label Text="{Binding TotalSeconds, StringFormat='{0:mm\\:ss}'}" HorizontalOptions="CenterAndExpand" FontAttributes="Bold" FontSize="20" TextColor="Black"></Label>
            <Button Text="Start" Command="{Binding StartCommand}" FontSize="20"></Button>
            <Button Text="Pause" Command="{Binding PauseCommand}" FontSize="20"></Button>
            <Button Text="Stop" Command="{Binding StopCommand}" FontSize="20"></Button>
            <Label Text="{Binding Time}" FontSize="20"></Label>
            <Label Text="{Binding Time2}" FontSize="20"></Label>
        </StackLayout>
    </ContentPage.Content>

</ContentPage>


Что я уже пробовал:

Я пытаюсь привязать Time2 в MainViewModel в методе private void StartTimerCommand но ничего не происходит

1 Ответов

Рейтинг:
9

Richard Deeming

Вы только устанавливаете Time и Time2 в конструкторе; вы никогда не обновляете их.

Вы также не вызываете события изменения свойств для этих свойств, поэтому даже если вы их обновите, привязка не будет обновляться.

Попробуйте что-нибудь вроде этого:

public class MainViewModel : ViewModelBase
{
    private Timer _timer;
    private TimeSpan _totalSeconds;
    private string _time;
    private string _time2;
    
    public TimeSpan TotalSeconds
    {
        get { return _totalSeconds; }
        set { Set(ref _totalSeconds, value); }
    }
    
    public string Time
    {
        get { return _time; }
        set { Set(ref _time, value); }
    }
    
    public string Time2
    {
        get { return _time2; }
        set { Set(ref _time2, value); }
    }

    public Command StartCommand { get; set; }
    public Command PauseCommand { get; set; }
    public Command StopCommand { get; set; }

    public MainViewModel()
    {
        StartCommand = new Command(StartTimerCommand);
        PauseCommand = new Command(PauseTimerCommand);
        StopCommand = new Command(StopTimerCommand);
        
        _timer = new Timer(TimeSpan.FromSeconds(1), CountDown);
    }
    
    private void StartTimerCommand()
    {
        if (TotalSeconds == TimeSpan.Zero)
        {
            TotalSeconds = TimeSpan.FromMinutes(5);
            Time = DateTime.Now.ToString("hh:mm tt");
            Time2 = null;
        }
        
        _timer.Start();
    }
    
    private void CountDown()
    {
        TotalSeconds -= TimeSpan.FromSeconds(1);
        if (TotalSeconds == TimeSpan.Zero)
        {
            StopTimerCommand();
        }
    }
    
    private void PauseTimerCommand()
    {
        _timer.Stop();
    }

    private void StopTimerCommand()
    {
        _timer.Stop();
        Time2 = DateTime.Now.ToString("hh:mm tt");
    }
}


Rey21

Большое вам спасибо за вашу помощь ,она хорошо работает