Как записать нажатия кнопок на Windows Phone и воспроизвести последовательность

Я работаю над приложением для Windows Phone 7, которое воспроизводит звуки при нажатии определенных кнопок. Я хотел бы иметь возможность «записывать» последовательность нажатых кнопок, чтобы казалось, что они воспроизводят то, что они «сочинили». Я предполагаю, что для отслеживания кликов будет использоваться какой-то таймер, а затем вы сможете воспроизвести клики позже. Я просто не могу двигаться в правильном направлении. Я ценю любые предложения или примеры.


person Dylan    schedule 18.07.2011    source источник
comment
Я думаю, что могу создать 2 списка/массива. У одного будут значения кнопки, по которым нажимают, а у другого будут значения GetTimeoutInterval.ToString(). Это звучит правильно?   -  person Dylan    schedule 18.07.2011


Ответы (1)


Я бы подключил все ваши кнопки к одному и тому же обработчику событий ICommand или Click. Затем в этом обработчике добавьте запись клика в очередь, прежде чем что-то с ней делать.

public class RecordedEvent
{
    public Button Button { get; set; } 
    public TimeSpan DelayTime { get; set; }
}

private Queue<RecordedEvent> _clickQueue = new Queue<RecordedEvent>();

private void Button_Click(object sender, RoutedEventArgs e)
{
    var button = sender as Button;
    var clickTime = DateTime.Now;

    //record the click by adding it to the queue
    _clickQueue.Enqueue(new RecordedEvent()
         { 
             Button = button,
             DelayTime = _lastClickTime - clickTime;
          };
    _lastClickTime = clickTime;

    DoAction(button); //do what ever needs to be done when the button it clicked
}

Затем, чтобы воспроизвести, нужно вернуть элементы из очереди.

public void PlayBack()
{
   var recordedClick = _clickQueue.Dequeue();
   while (recordedClick != null)
   {
       Thread.Sleep(recordedClick.DelayTime);
       DoAction(recordedClick.Button);
       recordedClick = _clickQueue.Dequeue();
   }
}

Теперь это не идеальное решение в любом случае (вам нужно убедиться, что _lastClickTime установлен правильно в первый раз и т. д.). Но это похоже на то, как я бы это реализовал.

Другая проблема заключается в том, что Thread.Sleep() заблокирует ваш пользовательский интерфейс, что плохо, поэтому вы можете использовать таймер, как вы предлагаете. В зависимости от разрешения, которое вам нужно, это может быть или не быть жизнеспособным. Другим вариантом может быть чтение Queue в фоновом потоке, а затем использование Dispatcher для вызова DoAction() (вызов Thread.Sleep() в фоновом потоке вполне допустим), но имейте в виду, что Queue не является потокобезопасным, поэтому вы нужно добавить логику синхронизации самостоятельно.

Во всяком случае, это должно заставить вас начать.

person 1adam12    schedule 18.07.2011