enter code here
我有一个ScrollViewer中在每当我背后叫ScrollToVerticalOffset方法从代码中无垂直滚动的Silverlight。的Silverlight的ScrollViewer进行滚动
基本上,我有我的视图(UserControl),其中包含ScrollViewer。我从我的ViewModel调用一个动作,在View的代码隐藏中触发一个事件,将VerticalOffset设置为一个特定的值。
首先,我知道这很丑陋。理想情况下,我希望我可以有一个可附加属性,可以将其绑定到ViewModel中的属性,设置时会导致更新VerticalOffset属性(我知道它是只读的),并滚动ScrollViewer。
ScrollViewer包含动态内容。因此,如果用户正在查看ScrollViewer中的内容,并向下滚动一下,然后单击按钮,则新内容将加载到ScrollViewer中。问题在于ScrollViewer的垂直偏移不会被重置,因此用户必须向上滚动才能阅读内容。所以,我的解决方案是能够控制ViewModel的垂直偏移,并且我绞尽脑汁,不能提出可行的解决方案,所以我正在寻找需要帮助的人。
顺便说一句 - 我已经包含了一个类,我放在一起的可附加属性的代码。这个属性绑定到ViewModel中的一个属性。当我在ViewModel中设置属性时,它会正确触发此类中的PropertyChanged回调方法,然后调用ScrollViewer的ScrollToVerticalOffset方法,但ScrollViewer仍不滚动。
public class ScrollViewerHelper
{
public static readonly DependencyProperty BindableOffsetProperty =
DependencyProperty.RegisterAttached("BindableOffset", typeof(double), typeof(ScrollViewerHelper),
new PropertyMetadata(OnBindableOffsetChanged));
public static double GetBindableOffset(DependencyObject d)
{
return (double)d.GetValue(BindableOffsetProperty);
}
public static void SetBindableOffset(DependencyObject d, double value)
{
d.SetValue(BindableOffsetProperty, value);
}
private static void OnBindableOffsetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ScrollViewer scrollViewer = d as ScrollViewer;
if (scrollViewer != null)
{
scrollViewer.ScrollToVerticalOffset((double)e.NewValue);
}
}
}
我不明白为什么这种解决方案无法正常工作......您是否试图将视口固定到元素面板的顶部或底部?你确定每次添加新元素时都会调用OnBindableOffsetChanged?如果你只是每次将视图模型属性设置为0.0(滚动到顶部),我可以看到它为什么只能在第一次被调用,而不会再被调用。 – 2010-01-27 03:34:29