2013-10-07 2 views
0

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

MainPage.xaml.cs

void newButton_Click(object sender, EventArgs e) 
{ 
    //Button vibration 
    if (Settings.EnableVibration.Value) //boolean flag to tell whether to vibrate or not 
    { 
     VibrateController.Default.Start(TimeSpan.FromMilliseconds(100)); 
     //place vibration stop here? 
    }   

    this.NavigationService.Navigate(new uri("/NewPage.xaml", UriKind.Relate)); 
} 

Я уже пробовал VibrationController.Default.Stop(); но это полностью исключает вибрацию вместе. Есть ли способ подождать до тех пор, пока вибрация не завершится, а затем перейти на новую страницу или выполнить какое-либо другое действие, которое должен выполнить этот метод? Любые рекомендации или рекомендации по этой реализации или другие предложения?

ответ

0

Вы можете использовать асинхронность для предотвращения блокировки пользовательского интерфейса. Вместо того, чтобы фактически блокировать поток пользовательского интерфейса, вам нужно запланировать действие, которое произойдет снова через 100 мс. Добавление continutation к Task.Delay вызова может сделать только что:

void newButton_Click(object sender, EventArgs e) 
{ 
    Action navigate =() => 
     this.NavigationService.Navigate(new uri("/NewPage.xaml", UriKind.Relate)); 
    if (Settings.EnableVibration.Value) //boolean flag to tell whether to vibrate or not 
    { 
     VibrateController.Default.Start(); 
     Task.Delay(100).ContinueWith(t => 
     { 
      VibrationController.Default.Stop(); 
      navigate(); 
     }); 
    } 
    else 
     navigate(); 
} 
+0

Спасибо. Что, если на самом деле я не хотел бы перейти на новую страницу, а просто приостановился, пока произошла вибрация. Это нормально 'if (Settings.EnableVibration.Value) // флаг boolean, чтобы указать, вибрировать или нет { VibrateController.Default.Start (TimeSpan.FromMilliseconds (40)); Task.Delay (45) .ContinueWith (t => { VibrateController.Default.Stop(); }); } ' Метод запуска VibrationController требует параметра TimeSpan. – Matthew

+0

Кроме того, будет ли установка «Задержка» на большее время, чем «Пуск», убедиться, что вибрация завершена, прежде чем перейти к следующему процессу? – Matthew

+0

@Matthew Если вы не хотите ничего делать после того, как вибрация остановится, просто перейдите в промежуток времени и ничего не делайте; все готово. Если вы хотите что-то сделать * правильно *, когда вибрация остановится, вы хотите, чтобы вы задерживали на меньшее время, чем время, которое вы проходите, чтобы вы могли запускать код, когда вы явно его останавливаете. – Servy

0

.NET оборачивает эту функцию до удобно в BackgroundWorker классе.

private void SomeMethod() 
{ 
    // Create backgroundworker 
    BackgroundWorker bw = new BackgroundWorker(); 
    // Attach event handler 
    bw.DoWork += bw_DoWork; 

    // Run Worker 
    bw.RunWorkerAsync(); 
} 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // Do background stuff here 
}  

Он также поддерживает информацию о ходе работ и инициирует событие на завершение, насколько я знаю, эта функция распространяется на Windows Phone. Все это описано в статье MSDN.

Я бы предположил, что вы хотите сделать, это вызвать вибрацию в BackgroundWorker, и вы можете прослушивать RunWorkerCompletedEvent, который будет срабатывать, когда он будет готов. Кроме того, вы можете с радостью приостановить эту «нить» и не будет мешать работе пользовательского интерфейса.

Смежные вопросы

 Смежные вопросы