2011-12-11 61 views
6

在WPF中,我有一個滾動查看器中有7個不同的groupboxes。每個組框都是針對不同形式的自己的單獨部分。由於滾動查看器很長,我在面板左側的一個堆棧面板中放置了一系列按鈕,並且完成了代碼隱藏,因此單擊按鈕會觸發相應groupbox的BringIntoView方法。BringIntoView方法

我的問題是,有沒有辦法強制BringIntoView每次在可見部分的頂部放置groupbox。默認情況下,BringIntoView只會移動滾動查看器,直到整個組框處於視圖中,而不是顯示最頂端的項目。有沒有解決的辦法?

我看着使用ScrollToVerticalOffset,但無法弄清楚如何獲得正確的位置,主要是因爲它說groupbox沒有Locate屬性,我將用它來獲取位置,然後使用ScrollToVerticalOffset 。我在輸入時想到的一件事就是先按下每個按鈕,然後立即繼續到正確的一個,但這看起來有點像黑客,我更喜歡找到正確的方法。 :)

+1

只是一個建議的話,如何少一點代碼,並將第一段分解成更小的更容易理解的段落。否則,我們只有一段文字和一段代碼,不會吸引太多注意力,並會讓人們失望。閱讀Jon Skeets關於如何在這裏提出完美問題的優秀帖子:http://msmvps.com/blogs/jon_skeet/archive/2010/08/29/writing-the-perfect-question.aspx – Kev

+0

+1編輯和增強問題 – SvenG

回答

9

試試這個:

private void ScrollToGroupBox(GroupBox groupBox) 
{ 
    GeneralTransform groupBoxTransform = groupBox.TransformToAncestor(scrollViewer); 
    Rect rectangle = groupBoxTransform.TransformBounds(new Rect(new Point(0, 0), groupBox.RenderSize)); 
    scrollViewer.ScrollToVerticalOffset(rectangle.Top + scrollViewer.VerticalOffset); 
} 

的代碼獲得您的組框中的ScrollViewer內,滾動到它的位置。

+1

很棒!現在我唯一的問題是在底部留下足夠的空間,以便最終的GroupBox在空間不足之前達到頂部。我通過在最終的GroupBox底部添加了一個邊距來實現這一點,但如果您知道更好的方式,我很樂意聽到它。它適用於我如何擁有它,但如果我調整窗口的高度,它不會達到。 –

+1

很高興能幫到你。我不知道更好的方法,但添加一個邊距或將組框高度設置爲與scrollviewer相同的值。 您可以通過以下xaml代碼綁定scrollviewer中最後一個groupbox的高度: SvenG