C# UWP ScrollViewer 改变 HorizontalScrollBarVisibility
C# UWP ScrollViewer changing HorizontalScrollBarVisibility
我有一个滚动查看器定义如下:
<ScrollViewer Name="svMain" HorizontalScrollMode="Enabled" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Disabled" VerticalScrollMode="Disabled">
当我在后面的代码中更改 属性 HorizontalScrollBarVisibility 时:
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;
这解决了我的问题。
我有一个滚动查看器定义如下:
<ScrollViewer Name="svMain" HorizontalScrollMode="Enabled" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Disabled" VerticalScrollMode="Disabled">
当我在后面的代码中更改 属性 HorizontalScrollBarVisibility 时:
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;
这解决了我的问题。