2011-02-07 99 views
0

我遇到了一个依赖属性问题,它不会触发更改。设置如下。我有一个充当ScrollViewer调解器的类,在那里我有一个ScrollViewer类型的依赖属性,以及2个double,VerticalOffsetNew和VerticalScrollOffset。所以我附上一个previewmousewheel事件来抓取来自鼠标滚轮的事件。WPF DependencyProperty只能触发一次

在这个事件中,我抓取scrollviewers当前偏移量并将VerticalScrollOffset设置为该值。然后,根据增量,我将VerticalOffsetNew设置为偏移+增量。

现在我看到的问题如下。 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的变化事件中,有一个调用动画方法的动画,该动画方法将动画VerticalScrollOffset DP。看起来,当我删除这个电话时,两个DP都改变了,但是一旦我有了它,它就会失败。有没有一些限制或冲突可能出现,我没有看到或WPF默默地尝试解决?

再次感谢。

+1

您是否确定`thisScroller.VerticalOffset`产生的后续值实际上与原始值不同?如果不是这样,那就可以解释为什么你的改变的处理程序不被重新执行,因为这个值没有改变。 – 2011-02-07 19:16:33

+0

是的,我之前检查过,这个值实际上与当前设置的值不同。谢谢。 – Nithos 2011-02-07 20:45:46

回答

0

您是否尝试过实施INotifyPropertyChanged?