我有DataGrid
和Canvas
:
<DataGrid Canvas.ZIndex="1" x:Name="dgTimeline"/>
<Canvas Height="30" Width="999" Canvas.ZIndex="2" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="71,387,0,0">
<Line Name="time" X1="0" Y1="0" X2="0" Y2="24" Stroke="Black" StrokeThickness="2"/>
</Canvas>
导致:
但是,当我移动DataGrid
的水平滚动条时,Canvas
明显停留在其位置,因为其父级是Window
而不是DataGrid
:{ {0}}
是否可以相对于Canvas
而不是其父级保持DataGrid
'位置,以便在滚动DataGrid
Canvas
时DataGrid
保持不变它是Canvas
的元素?我试图将DataGrid
放在{{1}}内,但这不起作用。
答案 0 :(得分:1)
您可以将水平滚动条添加到画布,然后尝试同步canvas和datagrid的水平滚动条。类似......
private void dataGrid_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
canvasScrollViewer.ScrollToHorizontalOffset(e.HorizontalOffset);
}
private void canvasScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
ScrollViewer dgScrollViewer = GetScrollViewerInstance();
dgScrollViewer.ScrollToHorizontalOffset(e.HorizontalOffset);
}
private ScrollViewer GetScrollViewerInstance()
{
var ctrl = VisualTreeHelper.GetChild(dataGrid, 0);
if (ctrl is Border)
{
var ctrl1 = VisualTreeHelper.GetChild(ctrl, 0);
if (ctrl1 is ScrollViewer)
{
dgScrollViewer = ctrl1 as ScrollViewer;
}
}
}
此代码只是为了让您了解如何执行此操作而不是实际工作代码。如果您不想显示Canvas的HorizontalScrollBarVisibility,则将其设置为Hidden。在这种情况下,您不需要第二个事件处理程序。