Using a RepeatButton to Rapidly Increment Values

January 01, 2015

Recently, I’ve been playing with the WPF `RepeatButton`. I’ve not used it before, as it does seem to fulfil a very specific purpose. The use that I was trying to put it to was to act in the same way as you would expect your alarm clock to behave if you changed the time.

Say it’s currently 3:10 and you need it to be 3:15; you’d simply press the plus button five times, right? But what if you want it to be 17:50? Well, you’d hold the plus button down, but you wouldn’t expect it to increase by minutes; you’d maybe expect it to jump by 30 mins at a time after holding the plus button for a while.

The RepeatButton can do the same… but unfortunately not out of the box.

The Box

What you can do out of the box is this:

 <RepeatButton Content="+" Name="IncreaseButton"/>

And to handle the click:



IncreaseButton.Click += new RoutedEventHandler(IncreaseButton\_Click);

Finally:



private void IncreaseButton\_Click(object sender, RoutedEventArgs e)
{            
    Value += 1;
}

What’s wrong with that?

So far, so good, but what if I want the increment to increase though, as described in the alarm clock scenario above? I have two options here. One thing you can do is to increase the frequency that you increment; however, what I wanted to do was to increase the increment. The way I did it was to store a count:



private int \_incrementButtonRepeat;

Then, in the `click` event:



private void IncreaseButton\_Click(object sender, RoutedEventArgs e)
{            
    if (\_incrementButtonRepeat > 5)
        Value += 5;
    else
        Value += 1;
    \_incrementButtonRepeat++;        
}

Finally, you’ll need to reset:



private void IncreaseButton\_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
    \_incrementButtonRepeat = 0;
}

A little gotcha here is the MouseUp command never seems to fire, because it’s apparently handled internally. Use the preview to intercept it first.

Conclusion

You could create a very basic control that encapsulates this behaviour, based on some parameters; then you’d never have to consider this again.



Profile picture

A blog about one man's journey through code… and some pictures of the Peak District
Twitter

© Paul Michaels 2024