我需要控制其位置与 Windows Phone 8 SDK (silverlight/wpf) 中的 ScrollViewer 的滚动偏移量直接相关。此外,我需要能够知道各种委托中的滚动偏移量,以便我可以更改其他应用内属性。这甚至可能吗?
我已经看遍了,但似乎找不到任何示例,我似乎也没有足够的掌握 WPF/Silverlight 的动画概念来学习这个。
我能想到的最好的如下所示。它一开始似乎可以工作,但不幸的是,只有当你的手指没有向下并且 ScrollViewer 没有动画时才会更新,所以更新太不频繁了。我需要更新作为动画循环的一部分,所以每一帧左右(每秒 60-100+),我都会得到新的滚动偏移值。有没有办法在动画循环中安排 DispatchTimer?或者是否有某种更好的方法来完全解决这个问题,使用 DependentProperties 之类的东西?
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!App.ViewModel.IsDataLoaded)
{
App.ViewModel.LoadData();
}
DispatcherTimer t = new DispatcherTimer();
t.Interval = TimeSpan.FromMilliseconds(16.6);
t.Tick += new EventHandler(
(object s, EventArgs ee) =>
{
// FunkBox is some ListBox
ScrollViewer sv = FindChildOfType<ScrollViewer>(FunkBox);
if (sv == null)
{
// TOffset is some TextBlock
TOffset.Text = "dur...";
}
else
{
TOffset.Text = String.Format("dur {0}", sv.HorizontalOffset);
}
});
t.Start();
}
static T FindChildOfType<T>(DependencyObject root) where T : class
{
var queue = new Queue<DependencyObject>();
queue.Enqueue(root);
while (queue.Count > 0)
{
DependencyObject current = queue.Dequeue();
for (int i = System.Windows.Media.VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)
{
var child = System.Windows.Media.VisualTreeHelper.GetChild(current, i);
var typedChild = child as T;
if (typedChild != null)
{
return typedChild;
}
queue.Enqueue(child);
}
}
return null;
}