Событие OnScrollChanged для моего ScrollViewer в MVVM WPF - PullRequest
0 голосов
/ 07 мая 2019

Я хочу использовать присоединенное свойство для обработки события ScrollChanged моего ScrollViewer.В тот момент, когда событие и логика обрабатываются в коде пользовательского интерфейса, который явно идет вразрез с MVVM.Мне было интересно, если у кого-нибудь есть идеи о том, как вы делаете это с прикрепленными свойствами?Единственные ресурсы, которые я нашел, кажутся очень длинными.Вот код, который у меня есть на минуту:

XAML:

<ScrollViewer x:Name="MyScroller" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" ScrollChanged="MyScroller_OnScrollChanged">

Код UI:

private void MyScroller_OnScrollChanged(object sender, ScrollChangedEventArgs e) {
            var scrollViewer = sender as ScrollViewer;


            if ((Math.Abs(e.ExtentHeightChange) < 0) && (Math.Abs(e.ExtentWidthChange) < 0)) return;
            var xMousePositionOnScrollViewer = Mouse.GetPosition(scrollViewer).X;
            var yMousePositionOnScrollViewer = Mouse.GetPosition(scrollViewer).Y;
            var offsetX = e.HorizontalOffset + xMousePositionOnScrollViewer;
            var offsetY = e.VerticalOffset + yMousePositionOnScrollViewer;

            var oldExtentWidth = e.ExtentWidth - e.ExtentWidthChange;
            var oldExtentHeight = e.ExtentHeight - e.ExtentHeightChange;

            var relx = offsetX / oldExtentWidth;
            var rely = offsetY / oldExtentHeight;

            offsetX = Math.Max(relx * e.ExtentWidth - xMousePositionOnScrollViewer, 0);
            offsetY = Math.Max(rely * e.ExtentHeight - yMousePositionOnScrollViewer, 0);



            scrollViewer.ScrollToHorizontalOffset(offsetX);
            scrollViewer.ScrollToVerticalOffset(offsetY);
        }
...