2011-12-22 11 views
5

Tengo una aplicación de temporizador y quiero hacer vibrar el teléfono una vez que el temporizador ha finalizado. Actualmente puedo reproducir un sonido hasta que se presione el botón OK, pero solo vibra una vez. ¿Cómo se puede repetir la vibración hasta que el usuario presione el botón OK?Vibrar hasta que se cierre el cuadro de mensaje Windows Phone 7

Este es mi código actual

SoundEffectInstance alarmSound = PlaySound(@"Alarms/"+alarmSoundString); 

VibrateController vibrate = VibrateController.Default; 

vibrate.Start(new TimeSpan(0,0,0,0,1000)); 

MessageBoxResult alarmBox = MessageBox.Show("Press OK to stop alarm", "Timer Finished", MessageBoxButton.OK); 

if (alarmBox == MessageBoxResult.OK) 
{ 
    alarmSound.Stop(); 
    vibrate.Stop(); 
} 

ACTUALIZACIÓN: He tratado de respuesta de Joe, que funciona si no llamo MessageBox.Show() Parece que parar en este punto hasta que se pulse OK.

+0

desea que vibre continuamente o pulso? – Joe

+0

@Joe Quiero que pulse – Chris

+6

Debe asegurarse de desconectarse después de un período de tiempo, de lo contrario podría correr el riesgo de drenar la batería para alguien que dejó su teléfono en otra habitación. –

Respuesta

2

VibrateController.Start(Timespan) generará un error si se pasa un valor superior a 5 segundos en, por lo que hay que hacer algún truco para mantener en marcha. Crea un temporizador y configúralo para reiniciar la vibración. Por ejemplo:

editado

Tonto de mí, se me olvidó que tanto Messagebox y DispatcherTimer se ejecutará en el mismo hilo. El MessageBox lo bloqueará. Prueba esto.

public partial class MainPage : PhoneApplicationPage 
{ 
    TimeSpan vibrateDuration = new TimeSpan(0, 0, 0, 0, 1000); 
    System.Threading.Timer timer; 
    VibrateController vibrate = VibrateController.Default; 
    int timerInterval = 1300; 
    SoundEffectInstance alarmSound = PlaySound(@"Alarms/"+alarmSoundString); 
    TimeSpan alramDuration; //used to make it timeout after a while 

    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     timer = new Timer(new TimerCallback(timer_Tick), null, 0, timerInterval); 
     alramDuration = TimeSpan.FromSeconds(0); 
     alarmSound.Play(); 
     MessageBoxResult alarmBox = MessageBox.Show("Press OK to stop alarm", "Timer Finished", MessageBoxButton.OK); 

     if (alarmBox == MessageBoxResult.OK) 
     { 
      StopAll(); 
     } 
    } 

    void timer_Tick(object sender) 
    { 
     //keep track of how long it has been running 
     //stop if it has gone too long 
     //otheriwse restart 

     alramDuration = alramDuration.Add(TimeSpan.FromMilliseconds(timerInterval)); 
     if (alramDuration.TotalMinutes > 1) 
      StopAll(); 
     else 
      vibrate.Start(vibrateDuration); 
    } 

    void StopAll() 
    { 
     timer.Change(Timeout.Infinite, Timeout.Infinite); 
     vibrate.Stop(); 
     alarmSound.Stop(); 
    } 
} 

Así que estoy usando un System.Threading.Timer en lugar del despachador. Es principalmente lo mismo, solo un poco menos de una API obvia. En lugar de llamar al Start() and Stop(), debe pasar un retraso. Para iniciarlo, pase en 0. Asimismo, mantendrá salirse de cada 1,3 segundos hasta que llame Change() que pasa en Timeout.Infinite

Un par de cosas a tener en cuenta:

  • vibrate.Start(vibrateDuration) es única llamada de la garrapata evento. Eso es porque el temporizador comenzará de inmediato.
  • Por sugerencia Mystere Man's, agregué un tiempo de espera. querrás algo como esto.
  • Es posible que desee refactorizar, y limpiar mi muestra
+0

. Creo que el MessageBox.Show() interfiere con esto.Si elimino los métodos de tiempo y parada de vibración, entonces comienza a vibrar continuamente después de presionar el botón OK – Chris

+0

@ Chris si quita los stops() s de la instrucción if. – Joe

+0

si elimino el botón de detener() el teléfono comienza a vibrar después de presionar el botón OK – Chris

0
SoundEffectInstance alarmSound = PlaySound(@"Alarms/"+alarmSoundString); 

VibrateController vibrate = VibrateController.Default; 

var vibrationLength = 1000; 
var startTime = DateTime.Now; 
vibrate.Start(new TimeSpan(0,0,0,0,vibrationLength)); 

MessageBoxResult alarmBox = MessageBox.Show("Press OK to stop alarm", "Timer Finished", MessageBoxButton.OK); 
var ok = false; 

While (!ok){ 
    if (alarmBox == MessageBoxResult.OK) 
    { 
    ok = true; 
    } 
    else{ 
    if(startTime.AddMilliseconds(vibrationLength * 1.2) < DateTime.Now) 
    { 
     startTime = DateTimne.Now; 
     vibrate.Start(new TimeSpan(0,0,0,0,vibrationLength)); 
    } 
    } 
} 

alarmSound.Stop(); 
vibrate.Stop(); 

Aproximadamente

no escribo código para el teléfono ventanas así que esto puede hacer que el teléfono deje de responder. Pero la Idea general es seguir comprobando si el usuario ha dado bien y, de no ser así, si se ha agotado el tiempo suficiente desde que la última vibración comenzó a comenzar una nueva.

Si desea que pulse, le sugiero que use AddMilliseconds y agregue una longitud mayor que la longitud de pulso que desee.

El uso de un temporizador en lugar

que pretender clase tiene este aspecto

public class buzzz 
{ 

    MessageBoxResult alarmBox; 
    DispatchTimer alarmTimer = new DispatchTimer(); 
    var vibrationLength = 1000.0; 
    var timerIncrease = 1.2; 
    VibrateController vibrate = VibrateController.Default; 

    public buzz() 
    { 
     alarmTimer.Interval = TimeSpan.FromMillseconds(vibrationLegnth * timerIncrease); 
     alarmTimer.Tick += alarmTimer_Tick 
    } 
    public void startBuzz() 
    { 
     SoundEffectInstance alarmSound = PlaySound(@"Alarms/"+alarmSoundString); 
     vibrate.Start(new TimeSpan(0,0,0,0,vibrationLength)); 
     alarmTimer.Start(); 
     alarmBox = MessageBox.Show("Press OK to stop alarm", "Timer Finished", MessageBoxButton.OK); 
    } 

    void alarmTimer_Tick(object sender, EventArgs e) 
     { 
      if(alarmBox == MessageBoxResult.OK) 
      { 
       alarmTimer.Stop(); 
       vibrate.Stop(); 
      } 
      else 
      { 
       vibrate.Start(new TimeSpan(0,0,0,0,vibrationLength)); 
      } 
     } 
}