Windows Phone 8 SDK (silverlight/wpf) の ScrollViewer のスクロール オフセットによって位置が直接関連付けられるコントロールが必要です。さらに、他のアプリ内プロパティを変更できるように、ある種のデリゲートのスクロール オフセットを知ることができる必要があります。これは可能ですか?
私はすべてを見てきましたが、例を見つけることができず、これを取り上げるのに十分な WPF/Silverlight のアニメーションの概念を把握していないようです。
私が思いついた最高のものを以下に示します。最初は機能しているように見えますが、残念ながら、指が下になく、ScrollViewer がアニメーション化されていない場合にのみ更新されるため、更新の頻度が低すぎます。アニメーション ループの一部として更新を行う必要があるため、フレームごとに (1 秒あたり 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;
}