Я хочу использовать присоединенное свойство для обработки события 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);
}