2013-10-07 124 views
0

我點擊一個按鈕後,會觸發手機振動。這通常效果很好,除非有時振動不會停止,直到我完全關閉應用程序。我想給應用程序時間來完成它的振動,然後繼續其餘的方法,但我根本不想阻止UI。我怎麼可能做到這一點如何在不阻止用戶界面的情況下暫停

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

您可以使用異步來防止阻止UI。而不是實際阻止用戶界面線程,你需要安排一個動作,從現在起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)//布爾值標誌告訴是否振動 { VibrateController.Default.Start(TimeSpan.FromMilliseconds(40)); (45).ContinueWith(t => { VibrateController.Default.Stop(); }); }' VibrationController Start方法需要TimeSpan參數。 – Matthew

+0

此外,將「延遲」設置爲比「開始」更長的時間,以確保振動在移至下一個過程之前完成? – Matthew

+0

@Mthethew如果在振動停止後你不想做任何事情,那麼只需在時間間隔內傳遞,不要做任何事情;你完成了。如果你想在振動停止時做某些事情*正確*,那麼你需要確保延遲的時間少於你傳遞的時間,這樣你可以在明確停止時運行代碼。 – 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,它將在完成時觸發。此外,你可以愉快地暫停這個「線程」,它不會干擾用戶界面。

相關問題