2012-12-10 42 views
1

我在我的項目中有一個RepeatButton,可以左右滾動圖形。我想讓滾動緩慢加速,因爲用戶用鼠標按住按鈕。據我所知,RepeatButton沒有內置此功能。是否有一種簡單的方法,我可以在用戶按住按鈕時緩慢減小按鈕的間隔屬性,然後在用戶鬆開按鈕時將其重置?逐漸減少RepeatButton的間隔

回答

1

我不認爲這是可能的。

的原因是RepeatButton架構在引擎蓋下的方式。基本上,當您按空格鍵或按下鼠標左鍵時,它會根據Interval屬性的當前設置啓動計時器。當您釋放鍵或鼠標按鈕時,定時器停止。 Interval屬性剛剛定義爲香草DependencyProperty,因此它不會執行任何操作來更新定時器的時間間隔。

你也許可以通過反射來修改時間間隔,也許停止/重新啓動計時器......但我不知道它真的值得。

+0

嗯,有趣。你能否提出任何類似的控制措施,以達到我想要的效果? –

+0

我不知道任何其他已有的控件會執行此操作。雖然取決於您的需求,但您可以使用RepeatButton工作方式的修改版本來播放自己的視頻。 RepeatButton從ButtonBase派生,並有一個(相對於其他框架控件)簡單的實現。 – Tim

+0

好的,謝謝! –

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使用以允許更加精細的控制。