逐渐减少RepeatButton的间隔

时间:2012-12-10 21:25:43

标签: c# wpf xaml repeatbutton

我的项目中有一个RepeatButton,左右滚动图形。当用户用鼠标按住按钮时,我希望滚动缓慢加速。据我所知,RepeatButton没有内置此功能。有一种简单的方法,我可以在用户按住按钮时慢慢减小按钮的间隔属性,然后在用户释放按钮时重置它?

2 个答案:

答案 0 :(得分:1)

我不认为这是可能的。

原因是RepeatButton在引擎盖下的架构方式。基本上,当您按空格键或按下鼠标左键时,它会根据Interval属性的当前设置启动计时器。松开按键或鼠标按钮时,计时器停止。 Interval属性仅定义为vanilla DependencyProperty,因此它不会更新计时器的间隔。

你可能会用反射修改一些东西以调整间隔并可能停止/重新启动计时器......但我不确定它真的值得。

答案 1 :(得分:1)

虽然有点黑客,但实际上通过扩展RepeatButton来实现这种效果非常简单,只要你想要的间隔总是可以表示为某个恒定基本区间的整数倍。

以下是一个如何做到这一点的简单示例:

public class AcceleratingRepeatButton : System.Windows.Controls.Primitives.RepeatButton
{
    private int _intervalCount = -1;
    protected override void OnClick()
    {
        //Always OnClick for the initial press
        if (_intervalCount < 0) {
            _intervalCount = -1;
            base.OnClick();
        } else if (ShouldTriggerRepeat(_intervalCount)) {
            base.OnClick();
        }
        _intervalCount += 1;
    }

    protected override void OnIsPressedChanged(DependencyPropertyChangedEventArgs e)
    {
        _intervalCount = -1;    //When the button is released, reset the counter
        base.OnIsPressedChanged(e);
    }

    private bool ShouldTriggerRepeat(int count)
    {
        const intervalsAtQuarterRate = 16   //For the first 16 intervals, trigger repeats at 1/4 the normal rate;
        const intervalsAtHalfRate = 16 + intervalsAtQuarterRate //the next 16 intervals at 1/2 the rate

        if (count < intervalsAtQuarterRate) {
            return (count & 7) == 0;    //Returns true every 4 intervals
        } else if (count < intervalsAtHalfRate) {
            return (count & 3) == 0;    //Returns true every 2 intervals
        } else {
            return true;
        }
    }
}

依赖属性可用于允许从xaml进行配置(排除有利于简洁),并且可以在ShouldTriggerRepeat中使用更复杂的逻辑以允许更精细的控制。