我的项目中有一个RepeatButton,左右滚动图形。当用户用鼠标按住按钮时,我希望滚动缓慢加速。据我所知,RepeatButton没有内置此功能。有一种简单的方法,我可以在用户按住按钮时慢慢减小按钮的间隔属性,然后在用户释放按钮时重置它?
答案 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中使用更复杂的逻辑以允许更精细的控制。