2011-02-07 26 views
0

私の依存プロパティの1つに変更が発生しない問題があります。セットアップは次のとおりです。私はScrollViewerのメディエータとして動作するクラスを持っています。そこには、ScrollViewerタイプと2つのDoubleとVerticalOffsetNewとVerticalScrollOffsetの依存関係プロパティがあります。そこで、私はマウスホイールからのイベントを取得するためのプレビューマウスホイールイベントを添付します。WPF DependencyProperty一度だけ起動する

この場合、スクロールビューアの現在のオフセットを取得し、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; 

    } 

上記はプレビューコードに1回のみ設定されている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'によって得られた後続の値が実際に元のものと異なっていることを確認しましたか?そうでない場合は、値が変更されていないため、変更されたハンドラが再実行されない理由を説明します。 –

+0

はい、前にチェックしたところ、値は現在設定されているものと実際には異なります。ありがとう。 – Nithos

答えて

0

INotifyPropertyChangedを実装しようとしましたか?

+0

いいえ、私は何も変わることはありません。このプロパティは完全なDPなので、イベントは自動的にトリガされるべきではありませんか?さらに私はそのプロパティでアニメーションを実行しているので、DPであることが必要です。 – Nithos

+0

私は間違っている可能性がありますが、すべての依存関係プロパティでINotifyPropertyChangedを使用して、正しく動作するようにします。どのように、そしてなぜ、かっこいい細部にはわからない。 –

関連する問題