2013-05-31 86 views
0

我有这个DataGridCanvasWPF画布相对位置

<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> 

导致: enter image description here

然而,当我移动DataGrid的水平滚动条Canvas明显岿然不动其位置,因为其父母是Window而不是DataGridenter image description here

是否可以保留Canvas相对于DataGrid而不是其父母的位置,以便在滚动DataGrid时,Canvas会保持不动,因为它是DataGrid的元素?我试图将Canvas放在DataGrid的内部,但那不起作用。

回答

1

您可以将水平滚动条添加到画布,然后尝试同步画布和数据网格的水平滚动条。像...

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; 
     } 
    } 
} 

此代码只是让你知道如何做到这一点,而不是实际的工作代码。如果您不想显示,请将“画布的Horizo​​ntalScrollBarVisibility”设置为“隐藏”。在这种情况下,你不需要第二个事件处理程序。

+0

其实你的代码就像一个魅力! –