我遇到了一个不依赖于更改的依赖项属性的问题。设置如下。我有一个类作为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默默地试图解决?
再次感谢。
答案 0 :(得分:0)
您是否尝试过实施INotifyPropertyChanged?