Я работаю над приложением для Windows Phone 7, которое воспроизводит звуки при нажатии определенных кнопок. Я хотел бы иметь возможность «записывать» последовательность нажатых кнопок, чтобы казалось, что они воспроизводят то, что они «сочинили». Я предполагаю, что для отслеживания кликов будет использоваться какой-то таймер, а затем вы сможете воспроизвести клики позже. Я просто не могу двигаться в правильном направлении. Я ценю любые предложения или примеры.
Как записать нажатия кнопок на Windows Phone и воспроизвести последовательность
Ответы (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 не является потокобезопасным, поэтому вы нужно добавить логику синхронизации самостоятельно.
Во всяком случае, это должно заставить вас начать.