Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带相对位置的WPF画布_Wpf_Canvas_Wpfdatagrid - Fatal编程技术网

带相对位置的WPF画布

带相对位置的WPF画布,wpf,canvas,wpfdatagrid,Wpf,Canvas,Wpfdatagrid,我有这个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=

我有这个
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
显然会停留在它的位置上,因为它的父窗口是
窗口,而不是
DataGrid


是否可以将
Canvas
相对于
DataGrid
而不是其父对象保持在这样的位置,即当滚动
DataGrid
时,
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;
        }
    }
}
这段代码只是给你一个如何做的想法,而不是一个实际的工作代码。如果不想显示画布的水平滚动条可见性,可以将其设置为隐藏。在这种情况下,您不需要第二个事件处理程序