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