Хотя я никогда не разрабатывал для Windows Phone, я очень хорошо знаком с XAML из WPF и имел похожие проблемы, мне нужно было синхронизировать ширину полос на нескольких гистограммах.Мое предлагаемое решение использует свойства зависимостей, чтобы вы могли связывать свои ListSelectors в XAML, как с SharedSizeGroup
в сетках. Если вы не знакомы с Свойствами зависимостей, начните с поиска here. Поскольку у меня нет доступа к запрограммированным сборкам для Windows Phone, это не было протестировано, но оно работает в очень похожих сценариях.
public class SyncedLongListSelector : LongListSelector
{
private ScrollBar scrollBar;
private static readonly Dictionary<string, List<SyncedLongListSelector>> Groupings = new Dictionary<string, List<SyncedLongListSelector>>();
public static readonly DependencyProperty GroupNameProperty =
DependencyProperty.Register("GroupName", typeof(string), typeof(SyncedLongListSelector), new PropertyMetadata(default(string)));
public string GroupName
{
get
{
return (string)GetValue(GroupNameProperty);
}
set
{
SetValue(GroupNameProperty, value);
}
}
public override void OnApplyTemplate()
{
scrollBar = GetTemplateChild("VerticalScrollBar") as ScrollBar; // See my comments
if (scrollBar != null)
scrollBar.Scroll += OnScroll;
base.OnApplyTemplate();
}
private void UpdateScrolPosition(double scrollBarValue)
{
scrollBar.Value = scrollBarValue;
}
private void OnScroll(object sender, ScrollEventArgs args)
{
foreach (var otherList in Groupings[GroupName].Where(l => !Equals(l, this)))
otherList.UpdateScrolPosition(scrollBar.Value);
}
}
scrollBar = GetTemplateChild("VerticalScrollBar") as ScrollBar;
Я нашел строку использовать в link вы предоставили.
Вам может понадобиться, чтобы добавить что-то, если установка scrollBar.Value
поднимает OnScroll
-Event, так что вы не получите переполнение стека :)
Также добавление элементов управления в Grouping
-dictionary осталось как execise к читателю , это должно быть довольно легко. Если вы сами создаете собственные элементы управления, попробуйте this ресурс для начинающих.
Чтобы использовать ваш готовый контроль просто добавить его в XAML следующим образом: <yourNamespace:SyncedLongListSelector GroupName="MySyncedGroup" />
Отличная реализация! – Depechie
@Shawn Kendrot - Большое спасибо за эту реализацию. Я использовал его и заработал около 95% пути. Вероятно, это достаточно хорошо, но у меня есть одно наблюдение - есть ли способ сделать «отказов» и «растянуть» синхронизацию между ними? Если вы проложите весь путь до вершины одного, он будет идти немного дальше, чем нужно, но другой не будет. Вы можете увидеть его в клипе Youtube прямо в конце.Это не самая большая проблема в мире, но, поскольку ваш ответ был настолько спонтанным, я подумал, что посмотрю, сможешь ли вы это решить. – Tim
Дайте мыши печенье, да? Geez! (просто шучу). Я посмотрю, есть ли способ решить это, возможно, в выходные. –