C # UWP ScrollViewer, изменяющий HorizontalScrollBarVisibility - PullRequest
0 голосов
/ 30 октября 2018

У меня есть средство просмотра прокрутки, определенное ниже:

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

Когда я изменяю свойство HorizontalScrollBarVisibility в коде позади:

svMain.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;

scrollviewer прокручивает до горизонтального смещения 0.

Как предотвратить это, и оставить горизонтальное смещение scrollviewer, как это было до этого изменения?

Ответы [ 3 ]

0 голосов
/ 31 октября 2018

AFAIK, ниже - лучший снимок, который вы можете сделать:

XAML:

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

Code-Behind:

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);
    }
}
0 голосов
/ 05 ноября 2018

Вместо использования:

svMain.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;

Я использовал:

svMain.HorizontalScrollMode = ScrollMode.Disabled;

И это исправило мою проблему.

0 голосов
/ 30 октября 2018

Полностью не проверено, но, возможно, оно может указать вам правильное направление.

public double offset = 0.0;

Сохранить смещение перед отключением полосы прокрутки:

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

После отключения добавьте значение смещения обратно на полосу прокрутки

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