【问题标题】:WPF - centering content in a scrollviewer?WPF - 在滚动查看器中居中内容?
【发布时间】:2011-08-05 23:23:35
【问题描述】:

我有一个滚动查看器,其中包含一个文本块项目的堆栈面板(实际上,这些可能是标签项,我在滚动查看器中使用堆栈面板来覆盖 tabcontrol 模板中的默认标签面板)。我想要做的是,当所选选项卡更改时,将新选择的选项卡移动到滚动查看器可见区域的中心。理想情况下,这适用于所有选项卡,即使是远端的选项卡,但我会满足于能够告诉滚动查看器滚动以使特定元素尽可能接近居中。

在 WPF 中是否有任何明显的方法可以实现这一点?我现在能想到的所有解决方案都涉及到自定义控件方面的大量工作。

【问题讨论】:

  • @Robert Levy:不应该这样做,如果没有答案真正回答了问题,则无需接受其中任何一个。

标签: c# wpf scrollviewer


【解决方案1】:

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

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

【讨论】:

  • 感谢您的提示。我是 MVVM 模式,需要在缩放时保持图像居中。我简单地在我的 ScrollChanged 事件上使用了一个命令,并将我的 scrollviewer 作为参数传递给该命令。从那里我可以将我的内容中心与我的 ViewModel 隔离开来。不过,这似乎有点骇人听闻。我可能最终会创建一个自定义滚动查看器,让我通过依赖属性来完成此操作。
【解决方案2】:

ScrollViewer.ScrollToHorizontalOffset() 是您正在寻找的。只需要计算所选元素相对于堆栈面板的偏移量。你可以通过selectedElement.TranslatePoint( new Point(), stackPanel)

要使远端的元素也能做到这一点,您需要在滚动查看器的开头和结尾添加一些“空白”元素以占用适当的空间。

为了让它看起来更漂亮,在计时器中调用 ScrollToHorizo​​ntalOffset 以使滚动“动画”而不是跳转

【讨论】:

    【解决方案3】:

    这对我有用:

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

    【讨论】:

    • 在 WPF 参考源中,您可以看到 ScrollableWidth = Math.Max(0.0, ExtentWidth - ViewportWidth) 以及高度。所以这相当于另一个答案(stackoverflow.com/a/9767075/3195477
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多