Отображать секундомер на экране? - PullRequest
0 голосов
/ 03 декабря 2018

Последние несколько дней я пытался сделать секундомер.Я думаю, мне просто нужно выяснить, как на самом деле заставить его отображаться на экране и обновлять каждую секунду, миллисекунды и т. Д. Любой код, который я вставил, не отображает таймер на экране и фактически показывает, что происходит.Я опубликую код ниже и ошибки, которые я получаю.Любая помощь будет удивительной.Спасибо.

 public partial class MainPage : ContentPage
{

    private const string Format = "{0:00}:{1:00}:{2:00}.{3:00}";

    DispatcherTimer dTimer = new DispatcherTimer();
    Stopwatch stopWatch = new Stopwatch();
    string currentTime = string.Empty;


    public MainPage()
    { 

        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan tSpan = stopWatch.Elapsed;

        // Format and display the TimeSpan value.
        string ClockTextBlock = String.Format(Format,
            tSpan.Hours, tSpan.Minutes, tSpan.Seconds,
            tSpan.Milliseconds / 10);
        Console.WriteLine("RunTime " + ClockTextBlock);
        InitializeComponent();

        InitializeComponent();

        dTimer.Tick += new EventHandler(dt_Tick);
        dTimer.Interval = new TimeSpan(0, 0, 0, 0, 1);

        void dt_Tick(object sender, EventArgs e)
        {
            if (stopWatch.IsRunning)
            {
                TimeSpan t = stopWatch.Elapsed;
                currentTime = String.Format("{0:00}:{1:00}:{2:00}",
                    tSpan.Hours, tSpan.Minutes, tSpan.Seconds);
                ClockTextBlock.ToString (currentTime);
            }
        }


    }

    public String Display(Object sender, String ClockTextBlock)
    {

        return ClockTextBlock + String.Format(Format);
    }
    public void StartButton_Click(Object sender, Stopwatch stopwatch)
    {
        dTimer.Start();
    }

    public void StopButton_Click(Object sender, Stopwatch stopwatch)
    {
        dTimer.Stop();
    }
    public void ResetButton_Click(Object sender, Stopwatch stopwatch)
    {
        stopwatch.Reset();
    }




}

}

Ошибки:

невозможно преобразовать из 'string' в 'System.IFormatProvider'code
DispatcherTimer.Tick' isне поддерживается языком;попробуйте напрямую вызвать методы доступа «DispatcherTimer.add_Tick (EventHandler)» или «DispatcherTimer.remove_Tick (EventRegistrationToken)» *

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Я сделал нечто подобное, что могло бы помочь вам.По сути, я хотел показать, сколько времени было загружено какое-то оборудование.У меня был вид в представлении, который был привязан к свойству.Затем я создал диспетчер, который каждые 50 мс вызывал метод, который обновлял свойство.В приведенном ниже примере он запускается при вызове конструктора для View-Model.

XAML

<Label Grid.Row="5" Grid.Column="2" Content="{Binding TimePortModuleIsUp}" />

View-Model

 private string timePortModuleIsUp;

 /// <summary>
 /// Gets / Sets how long the port module has been booted for.
 /// </summary>
 public string TimePortModuleIsUp
 {
  get
  {
       return timePortModuleIsUp;
  }
  Set
  {
       timePortModuleIsUp = value;
       OnPropertyChanged("TimePortModuleIsUp");
  }
 }

Создание объекта DispatcherTimer.

private DispatcherTimer t;

Конструктор в View-Model

Это создает объект диспетчера, который вызывает t_tick каждые 50 мс и запускает его.

// Create a dispatcher that calls t_tick every 50 ms.
t = new DispatcherTimer(new TimeSpan(0, 0, 0, 0, 50), DispatcherPriority.Background, t_Tick, Dispatcher.CurrentDispatcher);

// Start the timer.
t.IsEnabled = true;

и, наконец, метод, который являетсявызывается каждые 50 мс, обновляя свойство, с которым связана метка.

    /// <summary>
    /// Method that updates a property representing how long the port module has been booted for.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void t_Tick(object sender, EventArgs e)
    {
        this.TimePortModuleIsUp = new DateTime((DateTime.Now - this.ModuleBootTime).Ticks).ToString("HH:mm:ss");
    }
0 голосов
/ 03 декабря 2018

Вы можете попробовать этот подход.Это можно легко сделать с помощью метода async / await .Проверьте это:

async void UpdateLoop()
{
    while (true) //your condition when it should stop
    {
        label.Text = DateTime.Now.ToString("T");
        await Task.Delay(1000);
    }
}

Конечно, вам не нужно отображать фактическое время, но вы можете хранить свое время в переменной.И вы можете вызвать метод UpdateLoop() из любого метода / конструктора.Этот кодекс взят из официальной книги Xamarin.Forms (стр. 721).Я рекомендовал проверить это.

...