1

WPF と MVVM を使用してハンドヘルド デバイスをシミュレートしています (viewmodel はステート マシンであり、view はボタン付きのシミュレートされたプラスチック ケースです)。

デバイスのオンとオフを切り替えるジェスチャは、ボタンの「ロング クリック」です。たとえば、使用中に「OK」ボタンを押すと画面が表示されますが、3秒以上クリックしたままにすると、(シミュレートされた方法で)デバイスがオフになります。

とプロパティRepeatButtonを調べましたが、それらは同じイベントを発生させるようです。必要なのは、ボタンを 3 秒未満押し続けた場合は通常の を発射し、 3 秒以上押し続けた場合は別のを(おそらく 1 回) 発射することです。DelayIntervalClickClickLongClick

RepeatButton または通常の Button を使用して、これを行うにはどうすればよいですか?

4

2 に答える 2

3

これを行う 1 つの方法は、MouseDown および MouseUp イベントにバインドすることです。MouseDown で開始されるストップウォッチのようなものを使用し、MouseUp で経過した時間を確認します。3 秒未満の場合は、Click() アクションを実行します。3 秒を超える場合は、LongClick() アクションを実行します。

private void Button_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    stopwatch = new Stopwatch();
    stopwatch.Start();
}

private void Button_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
    stopwatch.Stop();

    if (stopwatch.ElapsedMilliseconds >= 3000)
    {
         // do Click()
    }
    else
    {
        // do LongClick
    }
}

そして、これが RepeatButton の解決策です。

private bool isLongClick;
private bool hasAlreadyLongClicked;
private void RepeatButton_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    isLongClick = false;
    hasAlreadyLongClicked = false;
    stopwatch = new Stopwatch();
    stopwatch.Start();
}

private void RepeatButton_Click(object sender, RoutedEventArgs e)
{
    if (!hasAlreadyLongClicked && stopwatch.ElapsedMilliseconds >= 3000)
    {
        hasAlreadyLongClicked = true;
        isLongClick = true;
        // do your LongClick action
    }
}

private void RepeatButton_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
    if (!isLongClick)
    {
        // do short click action
    }
}

ここでの秘訣は、RepeatButton は基本的に、間隔ごとに Click を起動する単なる Button であるということです。したがって、ボタンの PreviewMouseDown でストップウォッチを開始すると、Click イベントが発生するたびにストップウォッチで経過時間を確認し、結果に基づいてアクションを変更できます。

于 2014-10-31T20:19:15.550 に答える