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

非同期を使用して、UI をブロックしないようにすることができます。実際に UI スレッドをブロックするのではなく、今から 100 ミリ秒後にアクションが再び発生するようにスケジュールする必要があります。呼び出しに継続を追加すると、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 に答える
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 で vibrate を呼び出すことだと思います。終了時に起動する RunWorkerCompletedEvent をリッスンできます。また、この「スレッド」を喜んで一時停止することができ、UI に干渉することはありません。

于 2013-10-07T21:44:53.903 に答える