C# UWP ScrollViewer 改变 Horizo​​ntalScrollBarVisibility

C# UWP ScrollViewer changing HorizontalScrollBarVisibility

我有一个滚动查看器定义如下:

<ScrollViewer Name="svMain" HorizontalScrollMode="Enabled" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Disabled" VerticalScrollMode="Disabled">

当我在后面的代码中更改 属性 Horizo​​ntalScrollBarVisibility 时:

svMain.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;

scrollviewer 滚动到水平偏移量 0。

如何防止这种情况发生,并使 scrollviewer 的水平偏移保持在此更改之前的水平?

完全未经测试,但也许可以为您指明正确的方向。

public double offset = 0.0;

在禁用滚动条之前保存偏移量:

offset = svMain.HorizontalOffset;
svMain.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;

禁用后,将偏移值添加回滚动条

svMain.ChangeView(offset, null, null, false);

据我所知,以下是您可以搭配的最佳镜头:

XAML:

<ScrollViewer Name="svMain" HorizontalScrollMode="Enabled" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Disabled" VerticalScrollMode="Disabled" ViewChanged="svMain_ViewChanged">

代码隐藏:

double offset = 0.0;
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
  offset = GetScrollViewerOffsetProportion(svMain) ;
  svMain.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden;
}

public static void ScrollToProportion(ScrollViewer scrollViewer, double scrollViewerOffsetProportion)
{
  if (scrollViewer == null) return;
  var scrollViewerHorizontalOffset = scrollViewerOffsetProportion * scrollViewer.ScrollableWidth;
  var scrollViewerVerticalOffset = scrollViewerOffsetProportion * scrollViewer.ScrollableHeight;
  scrollViewer.ChangeView(scrollViewerHorizontalOffset, scrollViewerVerticalOffset, null);
}
public static double GetScrollViewerOffsetProportion(ScrollViewer scrollViewer)
{
  if (scrollViewer == null) return 0;

  var horizontalOffsetProportion = (scrollViewer.ScrollableWidth == 0) ? 0 : (scrollViewer.HorizontalOffset / scrollViewer.ScrollableWidth);
  var verticalOffsetProportion = (scrollViewer.ScrollableHeight == 0) ? 0 : (scrollViewer.VerticalOffset / scrollViewer.ScrollableHeight);

  var scrollViewerOffsetProportion = Math.Max(horizontalOffsetProportion, verticalOffsetProportion);
  return scrollViewerOffsetProportion;
}
private void svMain_ViewChanging(object sender, ScrollViewerViewChangingEventArgs e)
{
    if (svMain.HorizontalScrollBarVisibility == ScrollBarVisibility.Hidden)
    {
        ScrollToProportion(svMain, offset);
    }
}

而不是使用:

svMain.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;

我用过:

svMain.HorizontalScrollMode = ScrollMode.Disabled;

这解决了我的问题。