2011-12-11 58 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