【发布时间】:2010-01-26 22:34:36
【问题描述】:
enter code here我在 Silverlight 中有一个 ScrollViewer,当我从后面的代码调用 ScrollToVerticalOffset 方法时,它不会垂直滚动。
基本上,我的视图 (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(滚动到顶部),我可以理解为什么它可能只会在第一次被调用而不再被调用。
标签: c# silverlight