我遇到了一个依赖属性问题,它不会触发更改。设置如下。我有一个充当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默默地尝试解决?
再次感谢。
您是否确定`thisScroller.VerticalOffset`产生的后续值实际上与原始值不同?如果不是这样,那就可以解释为什么你的改变的处理程序不被重新执行,因为这个值没有改变。 – 2011-02-07 19:16:33
是的,我之前检查过,这个值实际上与当前设置的值不同。谢谢。 – Nithos 2011-02-07 20:45:46