【问题标题】:WPF ScrollViewer horizontal scrolling with buttonsWPF ScrollViewer 带有按钮的水平滚动
【发布时间】:2021-01-05 05:36:18
【问题描述】:

我在 ScrollViewer 中有一个水平方向的 ListBox。当列表增长时,它会自动滚动到最后一个元素。滚动条可以工作,但是必须为此禁用。我需要有单独的按钮,它们可以通过预定的迭代滚动 ScrollViewer(很像滚动条上的按钮)。为此,我尝试过:

sv.ScrollToHorizontalOffset(sv.HorizontalOffset + 20);

但是,ScrollViewer 的 Horizo​​ntalOffset 似乎始终为 0,并且该方法对任何值都不做任何事情。

sv.LineRight();
sv.LineLeft();

两者都不起作用,可能是因为唯一的子元素是 ListBox。 如果我将 ListBox 的方向更改为垂直,则 ScrollViewer 的 VerticalOffset 会随着滚动/添加新元素而改变,并且 ScrollToVerticalOffset 可以正常工作。为什么这与水平方向不同?还有其他解决方案吗?

注意:这是在没有使用 XAML 放置控件的情况下完成的。

【问题讨论】:

  • "ListBox ... inside a ScrollViewer" 一开始似乎没有意义。 ListBox 已经支持滚动。它有一个 ScrollIntoView 方法。
  • @Clemens 谢谢你,但我的想法是我需要将滚动位置移动一定数量的像素,而不仅仅是滚动到一个项目。

标签: c# .net wpf


【解决方案1】:

要完成这项工作,您需要做几件事:

删除外部ScrollViewer,只使用ListBox 中内置的ScrollViewer

在 ListBox 上设置以下属性:

ScrollViewer.CanContentScroll="False"

这将使HorizontalOffset 属性以像素为单位工作。当它设置为True 时,它可以在项目中使用。

ScrollViewer.HorizontalScrollBarVisibility="Hidden"

这将保持滚动活动,但会隐藏滚动条。

在您的代码中,您可以像这样获得ListBoxScrollViewer。在此示例中,我的 ListBox 被命名为 x:Name="ListBox"

var scrollViewer = ListBox.FindChildByType<ScrollViewer>();

最后,您可以像下面这样设置偏移量。在我的示例中,我创建了一个方法并从我的按钮单击事件处理程序中传递了一个值。

private void ScrollHorizontally(double offset)
{
    var scrollViewer = ListBox.FindChildByType<ScrollViewer>();

    scrollViewer?.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset + offset);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2023-03-20
  • 1970-01-01
  • 2014-04-27
  • 2022-12-08
  • 1970-01-01
  • 2011-01-02
相关资源
最近更新 更多