0

我有这个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>

结果是: 在此处输入图像描述

但是,当我移动的水平滚动条明显停留在它DataGridCanvas位置,因为它的父级是Window而不是DataGrid在此处输入图像描述

是否可以保持Canvas' 相对于 'DataGrid而不是其父级的位置,以便在滚动时DataGridCanvas保持静止,因为它是 aDataGrid的元素?我试图把Canvas里面的,DataGrid但没有奏效。

4

1 回答 1

2

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

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 的 Horizo​​ntalScrollBarVisibility 设置为 Hidden。在这种情况下,您将不需要第二个事件处理程序。

于 2013-05-31T21:50:19.413 回答