WPF DependencyProperty仅触发一次

时间:2011-02-07 18:52:56

标签: wpf dependency-properties

我遇到了一个不依赖于更改的依赖项属性的问题。设置如下。我有一个类作为ScrollViewer的中介,在那里我有一个ScrollViewer类型的依赖属性,以及2个双精度,VerticalOffsetNew和VerticalScrollOffset。所以我附上一个previewmousewheel事件来抓取来自鼠标滚轮的事件。

在这种情况下,我抓住scrollviewers当前偏移并将VerticalScrollOffset设置为该值。然后根据增量我将VerticalOffsetNew设置为偏移+ 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,现在有趣的是,在VerticalOffset的change事件中,调用一个动画方法,该方法将为VerticalScrollOffset DP设置动画。似乎当我删除该呼叫时,两个DP都正确地改变了但是一旦我失败了。是否存在一些可能产生的限制或冲突,我看不到或WPF默默地试图解决?

再次感谢。

1 个答案:

答案 0 :(得分:0)

您是否尝试过实施INotifyPropertyChanged?