1

私のプロジェクトには、グラフを左右にスクロールする RepeatButton があります。ユーザーがマウスでボタンを押したままにすると、スクロールがゆっくりとスピードアップします。私が知る限り、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 に答える