我有2个Silverlight DataGrids一个在另一个之上。我想同步他们的水平滚动条。 我试图将它们放在单独的滚动查看器中,并将源scrollviewer的水平偏移设置为目标scrollviewer的水平偏移,但这不起作用,下面的DataGrid scrollviewer disappers。我想这可能是因为这些Datagrid在StackPanel内? 我还尝试将这两个网格放在第三个网格中,并在其上应用scrollviewer,但这不起作用
有没有人知道如何解决这个问题? 非常感谢提前
答案 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。