Создать таймер обратного отсчета в Silverlight - PullRequest
2 голосов
/ 03 декабря 2010

Я хочу, чтобы счетчик отсчитывал от 60 секунд до 0. Я хочу, чтобы пользователь видел количество секунд в пользовательском интерфейсе. Чтобы добиться этого, я думал, что выведу простой текстовый блок, например, такой:

<StackPanel>
  <TextBlock Text=" " />
  <TextBlock Text=" seconds remaining" />
</StackPanel>

Тогда я думал об использовании таймера. Единственный таймер, о котором я знаю, это DispatcherTimer. Однако это не показывает, сколько времени прошло или сколько осталось времени. Из-за этого мне нечего связать.

private DispatcherTimer myTimer = new DispatcherTimer();    
public MainPage() {
  myTimer.Interval = new TimeSpan(0, 0, 60);
  myTimer.Tick += new EventHandler(myTimer_Tick);
  myTimer.Start();
}

Я не уверен, как это сделать. Сотрудник сказал мне, что я даже не должен этого делать, потому что это замедлит работу интерфейса. Но пользователи действительно хотят этого. Может кто-нибудь сказать мне:

1) Будет ли это так сильно мешать интерфейсу? 2) Если нет, как мне это сделать?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 03 декабря 2010
  1. Да. Это замедлит это незаметным количеством. Честно говоря, было бы абсолютно смешно беспокоиться об этом.

  2. На каждом тике уменьшать свойство. Свяжите свой интерфейс с этим свойством. В качестве альтернативы просто аннулируйте свойство на каждом тике и попросите получателя свойства рассчитать оставшееся время.

Вариант 1

myTimer.Interval = TimeSpan.FromSeconds(1);
myTimer.Tick += delegate
{
    this.SecondsRemaining = this.SecondsRemaining - 1;

    if (this.SecondsRemaining == 0)
    {
        myTimer.Dispose();
    }
};
this.SecondsRemaining = 60;
myTimer.Start();

...

// assumes your class implements INotifyPropertyChanged and you have a helper method to raise OnPropertyChanged
public int SecondsRemaining
{
    get { return this.secondsRemaining; }
    private set
    {
        this.secondsRemaining = value;
        this.OnPropertyChanged(() => this.SecondsRemaining);
    }
}

Вариант 2

myTimer.Interval = TimeSpan.FromSeconds(1);
myTimer.Tick += delegate
{
    this.OnPropertyChanged("TimeRemaining");

    if (this.TimeRemaining <= 0)
    {
        myTimer.Dispose();
    }
};
this.endTime = DateTime.UtcNow.AddMinutes(1);
myTimer.Start();

public int TimeRemaining
{
    get { return (endTime - DateTime.UtcNow).TotalSeconds; }
}
1 голос
/ 03 декабря 2010

Нет, он не должен портить пользовательский интерфейс, поскольку он будет срабатывать каждую секунду; Пример того, как это сделать, можно найти здесь .

Кроме того, вы также можете использовать раскадровку, которая работает в течение указанного вами периода времени и соответствующим образом настраивает компонент пользовательского интерфейса, однако я бы не рекомендовал такой подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...