WPF DependencyProperty срабатывает только один раз - PullRequest
0 голосов
/ 07 февраля 2011

У меня проблемы с одним из моих свойств зависимостей, которые не запускаются при изменении.Настройка заключается в следующем.У меня есть класс, который выступает в качестве посредника для 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 молча пытается разрешить?

Еще раз спасибо.

1 Ответ

0 голосов
/ 07 февраля 2011

Вы пытались реализовать INotifyPropertyChanged?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...