У меня проблемы с одним из моих свойств зависимостей, которые не запускаются при изменении.Настройка заключается в следующем.У меня есть класс, который выступает в качестве посредника для ScrollViewer, там у меня есть свойство зависимости для типа ScrollViewer и 2 double, VerticalOffsetNew и VerticalScrollOffset.Поэтому я присоединяю событие previewmousewheel к событиям, поступающим от колеса мыши.
В этом событии я получаю текущее смещение прокрутки и устанавливаю VerticalScrollOffset на это значение.Затем, в зависимости от дельты, я установил VerticalOffsetNew как offset + delta.
Теперь проблема, с которой я сталкиваюсь, заключается в следующем.VerticalScrollOffset, похоже, не устанавливается после первого раза.У меня есть событие onpropertychange для этого, и точка останова срабатывает только в первый раз.Другое свойство, которое устанавливается в событии предварительного просмотра (verticaloffsetnew), устанавливается каждый раз без проблем.
Есть идеи?
public double VerticalScrollOffset
{
get { return (double)GetValue(VerticalScrollOffsetProperty); }
set { SetValue(VerticalScrollOffsetProperty, value); }
}
public static readonly DependencyProperty VerticalScrollOffsetProperty =
DependencyProperty.Register("VerticalScrollOffset", typeof(double),
typeof(ScrollViewerOffsetMediator), new PropertyMetadata(OnVerticalScrollOffsetChanged));
public static void OnVerticalScrollOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ScrollViewerOffsetMediator mediator = (ScrollViewerOffsetMediator)d;
}
Выше мой DP, который устанавливается только один раз в предварительном просмотрениже приведен код предварительного просмотра.
private void CustomPreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
double mouseWheelChange = (double)e.Delta;
ScrollViewer thisScroller = (ScrollViewer)sender;
// not sure why the delta is so large here
//double newVOffset = this.VerticalOffset - (mouseWheelChange / 40);
// forcing scroll wheel to iterate by 8
mouseWheelChange /= Math.Abs(mouseWheelChange);
double newVOffset = thisScroller.VerticalOffset - (mouseWheelChange * 8);
// this does not trigger a change after the first time for some
// some strange reason !!!!!!!
this.VerticalScrollOffset = thisScroller.VerticalOffset;
if (newVOffset < 0)
{
this.VerticalOffset = 0;
}
else if (newVOffset > thisScroller.ScrollableHeight)
{
this.VerticalOffset = thisScroller.ScrollableHeight;
}
else
{
this.VerticalOffset = newVOffset;
}
e.Handled = true;
}
Спасибо за любую помощь.
Обновление
Итак, я заметил кое-что еще,предварительный вызов мыши обновляет и VerticalOffset, и VerticalScrollOffset.И то, и другое - это DP, но сейчас интересно то, что в событии change VerticalOffset есть вызов метода animate, который будет анимировать VerticalScrollOffset DP.Кажется, что когда я удаляю этот вызов, оба DP меняются правильно, но, как только я это делаю, это терпит неудачу.Есть ли какие-то ограничения или конфликты, которые могут возникнуть, которые я не вижу или WPF молча пытается разрешить?
Еще раз спасибо.