Постепенно уменьшить интервал на RepeatButton
У меня есть RepeatButton в моем проекте, который прокручивает график влево и вправо. Я хочу, чтобы прокрутка медленно ускорилась, когда пользователь удерживает кнопку мышью. Насколько я могу судить, RepeatButton не имеет этой встроенной функции. Есть ли простой способ, которым я мог бы медленно уменьшить свойство интервала кнопки, пока пользователь удерживает ее, а затем сбросить его, когда пользователь отпускает кнопку??
2 ответа
Я не думаю, что это возможно.
Причиной является способ RepeatButton
спроектирован под капотом В основном, когда вы нажимаете пробел или нажимаете левую кнопку мыши, он запускает таймер на основе текущих настроек Interval
имущество. Когда вы отпускаете клавишу или кнопку мыши, таймер останавливается. Interval
свойство просто определяется как ваниль DependencyProperty
так что он ничего не делает, чтобы обновить интервал таймера.
Возможно, вы могли бы что-то взломать с помощью отражения, чтобы настроить интервал и, возможно, остановить / перезапустить таймер... но я не уверен, что это действительно того стоило
Хотя это и немного хакерство, на самом деле этот эффект довольно просто достичь, расширяя 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, чтобы обеспечить более тонкую настройку управления.