完整列的 DataGrid 上下文菜单 header
DataGrid context menu for complete column header
如何向 complete 列 header 添加上下文菜单?这包括这张图片中的蓝色区域:
正在向单列 header 添加上下文菜单 already has been answered。
您应该为整个 DataGrid 声明 ContextMenu:
<DataGrid ContextMenu="{StaticResource ColumnChooserMenuDataGrid}"
PreviewMouseRightButtonUp="DataGrid_PreviewMouseRightButtonUp">
...
</DataGrid>
编写事件处理程序:
private void Grid_PreviewMouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
if (VisualHelper.FindVisualParent<DataGridColumnHeader>((DependencyObject)e.OriginalSource) != null)
return;
if (VisualTreeHelper.HitTest((Visual)e.OriginalSource, e.GetPosition((UIElement)sender))?.VisualHit is DataGridHeaderBorder)
return;
e.Handled = true;
}
VisualHelper 在哪里:
public static class VisualHelper
{
public static T FindVisualParent<T>(DependencyObject d) where T : class
{
while (d != null && !(d is T))
d = VisualTreeHelper.GetParent(d);
return d as T;
}
}
如何向 complete 列 header 添加上下文菜单?这包括这张图片中的蓝色区域:
正在向单列 header 添加上下文菜单 already has been answered。
您应该为整个 DataGrid 声明 ContextMenu:
<DataGrid ContextMenu="{StaticResource ColumnChooserMenuDataGrid}"
PreviewMouseRightButtonUp="DataGrid_PreviewMouseRightButtonUp">
...
</DataGrid>
编写事件处理程序:
private void Grid_PreviewMouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
if (VisualHelper.FindVisualParent<DataGridColumnHeader>((DependencyObject)e.OriginalSource) != null)
return;
if (VisualTreeHelper.HitTest((Visual)e.OriginalSource, e.GetPosition((UIElement)sender))?.VisualHit is DataGridHeaderBorder)
return;
e.Handled = true;
}
VisualHelper 在哪里:
public static class VisualHelper
{
public static T FindVisualParent<T>(DependencyObject d) where T : class
{
while (d != null && !(d is T))
d = VisualTreeHelper.GetParent(d);
return d as T;
}
}