1

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

4

2 回答 2

1

我不认为这是可能的。

存在的原因是RepeatButton引擎盖下的架构方式。基本上,当您按下空格键或按下鼠标左键时,它会根据Interval属性的当前设置启动一个计时器。当您释放按键或鼠标按钮时,计时器将停止。该Interval属性只是被定义为一个香草DependencyProperty,所以它不会做任何事情来更新计时器的间隔。

您可能可以通过反射来调整时间间隔,并可能停止/重新启动计时器......但我不确定它是否真的值得。

于 2012-12-10T22:00:52.200 回答
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 int intervalsAtQuarterRate = 16;   //For the first 16 intervals, trigger repeats at 1/4 the normal rate
        const int 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 中使用更复杂的逻辑以允许更精细的控制。

于 2015-05-13T15:39:07.320 回答