У меня есть стандартное приложение Panorama, но один ключевой элемент данных повторяется в двух смежных PanoramaItems
.
Мне бы хотелось, чтобы эти два PanoramaItems
имели одинаковую вертикальную позицию прокрутки (чтобы избавить пользователя от необходимости снова находить ключевой элемент).
Есть ли способ получить и установить положение прокрутки элемента управления PanoramaItem
и обнаружить изменение прокрутки?
Общее решение (спасибо Полу Дистону за подсказки):
/// <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;
}