Совместное использование HorizontalOffset между двумя ScrollViewer, созданными в разных шаблонах данных - PullRequest
3 голосов
/ 21 октября 2011

У меня есть два ItemsControls, которые используют ту же коллекцию, что и ItemsSource. ItemTemplates для обоих ItemsControls очень похожи: внутри обоих DataTemplates есть ScrollViewer.

Вопрос:

Если я изменяю HorizontalOffset в одном из ScrollViewer, сгенерированных в первом ItemsControl, как я могу прокрутить ScrollViewer из второго ItemsControl, , который имеет тот же объект, что и DataContext , в тот же HorizontalOffset?

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

Если вы выполните поиск Google для WPF ScrollViewer Synchronization, вы получите много хороших результатов, таких как эта статья о проекте кода

0 голосов
/ 21 октября 2011

Как упоминала Рэйчел, у вашей проблемы может быть множество решений. Тем не менее, вещи, которые я видел, немного сложны или не просты для меня. Итак, я подумал, что это очень просто и может применить весь элемент управления, который имеет ScrollViewer в VisualTree.

В следующем коде предполагается, что два элемента управления, имеющие ScrollViewer в VisualTree, уже определены в Xaml, и в моем коде они названы control1 и control2 .

public partial class MainWindow : Window
{
    private ScrollViewer _scrollViewer1;
    private ScrollViewer _scrollViewer2;

    public MainWindow()
    {
        InitializeComponent();
        Loaded += (s, e) =>
                    {
                        _scrollViewer1 = FindScrollViewer(**control1**);
                        _scrollViewer2 = FindScrollViewer(**control2**);
                        if (_scrollViewer1 == null || _scrollViewer2 == null) throw new InvalidOperationException();
                        _scrollViewer1.ScrollChanged += ScrollViewer1ScrollChanged;
                        _scrollViewer2.ScrollChanged += ScrollViewer2ScrollChanged;
                    };
    }

    private ScrollViewer FindScrollViewer(Visual visual)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
        {
            var visualChild = VisualTreeHelper.GetChild(visual, i) as Visual;
            if (visualChild == null) continue;
            var scrollViewer = visualChild as ScrollViewer;
            if (scrollViewer != null)
            {
                return scrollViewer;
            }
            return FindScrollViewer(visualChild);
        }
        return null;
    }

    private void ScrollViewer1ScrollChanged(object sender, ScrollChangedEventArgs e)
    {
        _scrollViewer2.ScrollToVerticalOffset(_scrollViewer1.VerticalOffset);
    }

    private void ScrollViewer2ScrollChanged(object sender, ScrollChangedEventArgs e)
    {
        _scrollViewer1.ScrollToVerticalOffset(_scrollViewer2.VerticalOffset);
    }
}
...