WPF画布具有相对位置

时间:2013-05-31 20:49:33

标签: wpf canvas wpfdatagrid

我有DataGridCanvas

<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而不是DataGrid:{ {0}}

是否可以相对于Canvas而不是其父级保持DataGrid'位置,以便在滚动DataGrid CanvasDataGrid保持不变它是Canvas的元素?我试图将DataGrid放在{{1}}内,但这不起作用。

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