Silverlight DataGrid滚动条同步

时间:2011-05-11 11:56:31

标签: datagrid silverlight-3.0 scrollviewer

我有2个Silverlight DataGrids一个在另一个之上。我想同步他们的水平滚动条。 我试图将它们放在单独的滚动查看器中,并将源scrollviewer的水平偏移设置为目标scrollviewer的水平偏移,但这不起作用,下面的DataGrid scrollviewer disappers。我想这可能是因为这些Datagrid在StackPanel内? 我还尝试将这两个网格放在第三个网格中,并在其上应用scrollviewer,但这不起作用

有没有人知道如何解决这个问题? 非常感谢提前

1 个答案:

答案 0 :(得分:1)

我在SL4中这样做了,不知道它是否适用于SL3,对不起。文档声明API存在,但我没有尝试过。

诀窍是使用自动化同行。获取两个网格的滚动模式自动化对等体。当滚动发生在一个网格上时,滚动另一个网格通过自动化同行。

为了使这更具体,假设我们有2个网格,名为_dgGrowth和_dgTotals:

using System.Windows.Automation.Peers;
using System.Windows.Automation.Provider;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;

    public partial class MyPageWithGrids : Page {
...
        private ScrollBar _sbGrowth, _sbTotals;
        private AutomationPeer _peerGrowth, _peerTotals;
        private bool _ignoreScrollEvents;

        private void OnPageLoaded(object sender, RoutedEventArgs e) {

            _sbGrowth = GetHorizontalScrollBar(_dgGrowth);
            if (_sbGrowth != null) {
                _sbGrowth.Scroll += OnScrollGrowthGrid;
            }
            _sbTotals = GetHorizontalScrollBar(_dgTotals);
            if (_sbTotals != null) {
                _sbTotals.Scroll += OnScrollTotalsGrid;
            }

            _peerGrowth = FrameworkElementAutomationPeer.CreatePeerForElement(_dgGrowth);
            _peerTotals = FrameworkElementAutomationPeer.CreatePeerForElement(_dgTotals);
        }

        private ScrollBar GetHorizontalScrollBar(DataGrid parentGrid) {
            return parentGrid.Descendents().OfType<ScrollBar>().FirstOrDefault(sb => sb.Name == "HorizontalScrollbar");
        }

        private void OnScrollTotalsGrid(object sender, ScrollEventArgs e) {

            if (! _ignoreScrollEvents) {
                SyncHorizontalScroll(_peerTotals, _peerGrowth);
            }
        }

        private void OnScrollGrowthGrid(object sender, ScrollEventArgs e) {

            if (! _ignoreScrollEvents) {
                SyncHorizontalScroll(_peerGrowth, _peerTotals);
            }
        }

        private void SyncHorizontalScroll(AutomationPeer source, AutomationPeer copy) {

            IScrollProvider sourceProvider = null;
            if (source != null) {
                sourceProvider = (IScrollProvider) source.GetPattern(PatternInterface.Scroll);
            }
            IScrollProvider copyProvider = null;
            if (copy != null) {
                copyProvider = (IScrollProvider) copy.GetPattern(PatternInterface.Scroll);
            }

            if (sourceProvider != null && copyProvider != null) {

                _ignoreScrollEvents = true;

                // scroll copy at horizontal position of source, and keep vertical position
                copyProvider.SetScrollPercent(sourceProvider.HorizontalScrollPercent, copyProvider.VerticalScrollPercent);

                _ignoreScrollEvents = false;
            }
        }
    }

未显示的是将Loaded事件设置为OnPageLoaded并找到Descendants()方法in this question

相关问题