我有一个标准的基于全景的应用程序,但一个关键数据项在两个相邻的PanoramaItems
.
我希望这两个PanoramaItems
具有相同的垂直滚动位置(以节省用户必须再次找到关键项目)。
有没有办法获取和设置PanoramaItem
控件的滚动位置并检测滚动变化?
通用解决方案(感谢 Paul Diston 提供的线索):
/// <summary>
/// Scroll each new PanoramaItem to the same position as the previous one
/// </summary>
private void Panorama_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.RemovedItems.Count > 0 && e.AddedItems.Count > 0)
{
// Add logic here if only specific PanoramaItems are required to sync
ScrollViewer firstChildAsScrollViewer =
GetChildOfType(e.RemovedItems[0] as DependencyObject, typeof (ScrollViewer)) as ScrollViewer;
ScrollViewer secondChildAsScrollViewer =
GetChildOfType(e.AddedItems[0] as DependencyObject, typeof (ScrollViewer)) as ScrollViewer;
if ((firstChildAsScrollViewer != null) && (secondChildAsScrollViewer != null))
{
secondChildAsScrollViewer.ScrollToVerticalOffset(firstChildAsScrollViewer.VerticalOffset);
}
}
}
/// <summary>
/// Bredth-first recursive check for a child of the specified type
/// </summary>
private DependencyObject GetChildOfType(DependencyObject element, Type type)
{
int count = VisualTreeHelper.GetChildrenCount(element);
for (int i = 0; i < count; i++)
{
var e = VisualTreeHelper.GetChild(element, i);
if (e.GetType() == type)
{
return e;
}
}
// Now try the grandchildren
for (int i = 0; i < count; i++)
{
var e = VisualTreeHelper.GetChild(element, i);
var ret = GetChildOfType(e, type);
if (ret != null)
{
return ret;
}
}
return null;
}