2009-06-04 15 views
3

次のコードを検討して、私はWPFの「オン/オフ」ボタンであるテキストブロックを持っています。これは楕円の内側にあるON/OFFのテキストです。ユーザーがボタンをクリックして1秒間左マウスを保持すると、デバイスの電源が入っていない場合は、「デバイスをオンにする」というコードが実行されます。ユーザーがON/OFFボタンを3秒以上(左マウスボタンHELDを押したままに)保っていると、デバイスはオフになります。WPF DispatcherTimerおよびマウスボタンのクリックタイミングの変更

私はボートを紛失しているいくつかの問題。 1.タイマーが開始されているにもかかわらず、マウスボタンが押されている間、ティックイベントが発生していません。 2. do/whileループは、ボタンを持ち上げても終了しません。

ありがとう!

public int TimerCount = 0; 

    private void ButtonPressTimer(object sender, EventArgs e) 
    { 
     TimerCount = TimerCount + 1; 
    } 

    private void txtBlockOnOff_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var buttonPressTimer = new DispatcherTimer(new TimeSpan(0, 0, 0, 1), DispatcherPriority.Normal, ButtonPressTimer, this.Dispatcher); 

     do 
     { 
      if (!buttonPressTimer.IsEnabled) 
       buttonPressTimer.Start(); 
     } 
     while (e.ButtonState == MouseButtonState.Pressed); 

     buttonPressTimer.Stop(); 
     if (TimerCount >= 3) 
     { 
      //do something here 
     } 
     else 
     { 
      //do something different here 
     } 
    } 

答えて

5

私は、タイマー設定のオーバーヘッドを必要としない、少し異なるアプローチを検討します。マウスダウンイベントとアップイベントの両方を処理し、ボタンが押された時刻を保存すると、マウスが離されたときと比較して何をするかを決めることができます。

private DateTime mousePressed; 

private void txtBlockOnOff_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    mousePressed = DateTime.Now; 
} 

private void txtBlockOnOff_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    // button released 

    TimeSpan difference = DateTime.Now - mousePressed; 

    if (difference.TotalSeconds >= 3) 
    { 
     // long press 
    } 
    else 
    { 
     // short press 
    } 
} 
+0

ちなみに、短いプレスは1秒、長いプレスは3秒ですが、これはコードに反映されていません。オリジナルと同様に、私の例では、長いプレスは3秒以上のもので、短いプレスはそれ以下のものであると仮定しています。これを変更すると、私が投稿したコードを使用するのが簡単になります。TimeSpanと比べて、あなたが好きなだけ具体的にできるからです。 –

1

Dispatcher Timersは同じスレッドで起動しますが、Clickedハンドラに滞留しています。

編集:それについて考える - どのように誰がMousePressedフラグを変更する予定ですか? スレッドが1つしかありませんが、ハンドブックでブロックすると、WPFは何かを実行できません。

3

この質問に対する答えは、あなたが必要とするものを正確に実行するRepeatButtonを使用することです。つまり、ボタンを放置するまでイベントを発生させ続けます。

関連する問題