WPF - 如何在ScrollViewer中居中内容?

19
我有一个包含文本块项目的 StackPanel 滚动视图(实际上,这些可能是选项卡项,我在滚动视图中使用堆栈面板来覆盖选项卡控件模板中的默认选项卡面板)。我希望能够在选择的选项卡更改时将新选择的选项卡移动到滚动视图可见区域的中心位置。理想情况下,这将适用于所有选项卡,即使是在远侧的选项卡也是如此,但我愿意让滚动视图滚动以使特定元素尽可能靠近中心。

有没有明显的方法在WPF中实现这一点?我目前能想到的所有解决方案都需要大量的自定义控件操作。 enter image description here

2
@Robert Levy:这不是正确的做法,如果没有答案真正回答了问题,那么就没有必要接受其中任何一个。 - H.B.
3个回答

19

您可以使用以下代码轻松将内容设置为中心;

scrollviewer.ScrollToVerticalOffset(scrollviewer.ScrollableHeight / 2);
scrollviewer.ScrollToHorizontalOffset(scrollviewer.ScrollableWidth / 2);

谢谢这个提示。我正在使用MVVM模式,并需要在缩放时保持图像居中。我简单地在我的ScrollChanged事件上使用了一个命令,并将我的scrollviewer作为参数传递给该命令。从那里,我能够从我的ViewModel中保持我的内容居中。虽然似乎有点hack,但我可能最终会创建一个自定义的scrollviewer,通过依赖属性让我做到这一点。 - KyleLib

9

ScrollViewer.ScrollToHorizontalOffset() 是您要寻找的内容。只需要计算所选元素相对于堆栈面板的偏移量即可。您可以使用类似于 selectedElement.TranslatePoint( new Point(), stackPanel) 的方法来获取它。

为了使这对两端的元素都起作用,您需要在滚动查看器的开头和结尾添加一些“空白”元素,以占据适当的空间。

为了使其看起来漂亮,请在定时器中调用 ScrollToHorizontalOffset 以使滚动“动画化”,而不是跳跃。


1
这对我有用:

//for ScrollViewer s;
s.ScrollToHorizontalOffset((s.ExtentWidth - s.ViewportWidth) / 2);
s.ScrollToVerticalOffset((s.ExtentHeight - s.ViewportHeight) / 2);

1
在WPF参考源代码中,您可以看到ScrollableWidth = Math.Max(0.0, ExtentWidth - ViewportWidth),高度同理。因此,这与其他答案(https://dev59.com/Im035IYBdhLWcg3wBLRL#9767075)等效。 - StayOnTarget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接