覆盖在DataGrid内容之上

时间:2017-11-27 05:05:48

标签: c# wpf datagrid

我有一个DataGrid,用户可以将文件拖放到这些文件中以便导入到程序中。我想在发生这种情况时添加一些用户反馈,所以当用户拖放时我在DataGrid上放置了一个叠加层。叠加层的当前外观如下:

My overlay in action

我不喜欢叠加层覆盖DataGrid标头顶部的方式。如果可能的话,我想将叠加层限制在内容中。有谁知道我能做到这一点?我知道我可以硬编码标题的高度或者可能创建一个自定义控件但是更轻量级/不显眼的解决方案在我看来更好。这是我想要的图表,如果不清楚的话:

Diagram of desired result

更多信息:在我当前的实现中,我只需要在Grid中包含DataGrid和叠加层,并根据需要打开和关闭叠加层的不透明度。我的DataGrid下的瘦矩形是一个加载栏。我更喜欢叠加不要过去,尽管它在当前的实现中没有,所以我不认为这是一个问题。

编辑:以下是我最终解决问题的方法,它非常快速而且很脏但是很有效。

private void UserControl_Loaded(object sender, RoutedEventArgs e) {
    var header = WPFHelper.FindVisualChild<DataGridColumnHeadersPresenter>(FilesDataGrid);
    // Include outside border in margin
    var border = FilesDataGrid.BorderThickness;
    Thickness margin = new Thickness(border.Left, border.Top, border.Right, border.Bottom);
    margin.Top += header.ActualHeight;

    OverlayGrid.Margin = margin;
}

1 个答案:

答案 0 :(得分:1)

除了将覆盖元素的上边距设置为标题的实际高度之外,没有什么比“轻量级/不显眼”了。因此,如果您不想使事情过于复杂,可以将Margin设置为23.96的硬编码值:

<Grid>
    <DataGrid>
        <DataGrid.Columns>
            <DataGridTextColumn Header="..." Binding="{Binding}" />
        </DataGrid.Columns>
    </DataGrid>
    <Border Background="Silver" Opacity="0.5" Margin="0 23.96 0 0" />
</Grid>

更灵活的解决方案是编写一个行为,在可视树中找到DataGridColumnHeadersPresenter,并将overlay元素的上边距设置为ActualHeight