2010-12-20 78 views
3

我試圖實現類似於Excel的「無限」可滾動性;因爲用戶可以滾動到文檔的「底部」但隨後保持滾動(使用滾輪或滾動條上的向下箭頭),並且更多地爲它們生成空行。我有這個主要工作(當使用鼠標滾輪它完美的作品);但是我在SmallIncrement功能方面遇到麻煩 - 也就是說,當用戶單擊滾動條上的向下箭頭時,儘管位於滾動條可滾動範圍的底部,它應該由scrollbar.SmallChange降低。ScrollBar值設置不正確

這裏是我的代碼(在scrollBar_Scroll的處理程序):

int difference = e.NewValue - e.OldValue; 
if (e.Type == ScrollEventType.SmallIncrement) 
{ 
    if (difference != scrollBar.SmallChange) 
    { 
     int increase = (scrollBar.SmallChange - difference); 
     scrollBar.Maximum += increase; 
     scrollBar.Value += increase; 
    } 
} 

在調試器看它,這臺價值正是我所期望的。但是,函數結束後會發生一些(不知道是什麼),導致scrollBar.Value被設置回原來的值,再加上一個。如果我按住向下箭頭,它大多正確地工作。一旦釋放按鈕,它仍會跳回一點點。

任何想法是什麼可能導致這一點,以及任何修復它的方式?

乾杯!

編輯:這是我的滾輪代碼。它非常相似,令人困惑的是它爲什麼不起作用。這是在包含面板的MouseWheel事件處理程序中。

int desiredValue = scrollBar.Value - e.Delta; 
scrollBar.MaximumValue = (Math.Max(normalBottom, desiredValue + scrollBar.LargeChange)); 
scrollBar.Value = Math.Max(0, desiredValue); 

normalBottom是一個變量記住「有限」的滾動條的結束 - 在Excel中,這將是任一的最低用戶輸入的數據,或在屏幕的高度;所以它通常高於此值(不會變爲負值)。

+0

你爲什麼使用這個比較:if(difference!= scrollBar.SmallChange)?出於什麼目的? – 2011-01-06 08:16:23

+0

如果不同!= SmallChange,它意味着如果可滾動範圍觸發底部。 – Smashery 2011-01-06 23:21:44

回答

5

您的滾動條發生的情況如下:當用戶與滾動條交互導致事件並且您的事件處理程序被調用屬性值尚未更新時,事件處理程序返回該屬性由內部設置滾動條覆蓋您設置的值並導致您提到的「跳回」效果。它如何記住它必須設置的價值?簡單:它在e.NewValue中。而這正是你的解決方案,能夠正確的方式來改變滾動事件時該屬性的最終值只寫e.NewValue如下:

int difference = e.NewValue - e.OldValue; 
     if (e.Type == ScrollEventType.SmallIncrement) 
     { 
      if (difference != scrollBar.SmallChange) 
      { 
       int increase = (scrollBar.SmallChange - difference); 
       scrollBar.Maximum += increase; 
       e.NewValue = scrollBar.Value + increase; 
      } 
     } 

我想鏈接theese頁面可能有關你: http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.maximum.aspx

注意,在備註(這就是爲什麼即使移動Maximun你仍然可以得到它僅提前1):

最大值只能以編程方式達到。滾動條的值在運行時無法通過用戶交互達到其最大值。通過用戶交互可以達到的最大值等於1加上最大屬性值減去LargeChange屬性值。如果有必要,可以將最大屬性設置爲對象的大小-1佔1

http://msdn.microsoft.com/en-us/library/system.windows.forms.scrollbar.scroll.aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.scrolleventargs.newvalue.aspx 術語(獲取或設置滾動條的新值。[着重在設置])

+0

非常感謝!這完美地解決了這個問題! – Smashery 2011-01-07 00:05:23