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(); 但这完全消除了振动。有没有办法简单地等到振动完成后再导航到新页面,或者执行该方法应该执行的任何其他操作?关于此实施或其他建议的任何建议或建议?

4

2 回答 2

0

BackgroundWorker.NET 在类中方便地封装了这个功能。

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 中调用 vibrate,你可以监听 RunWorkerCompletedEvent,它会在完成时触发。此外,您可以愉快地暂停这个“线程”,它不会干扰 UI。

于 2013-10-07T21:44:53.903 回答
0

您可以使用异步来防止阻塞 UI。您需要安排一个动作在 100 毫秒后再次发生,而不是实际阻塞 UI 线程。在调用中添加延续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();
}
于 2013-10-07T18:29:06.817 回答