2011-02-07 103 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?