Martin
Martin

Reputation: 2086

DataGrid context menu for complete column header

How can I add a context menu to the complete column header? That’s including the blueish area in this picture:

DataGrid

Adding a context menu to the headers of single columns already has been answered.

Upvotes: 1

Views: 403

Answers (1)

Grigoriy
Grigoriy

Reputation: 116

You should declare ContextMenu to the entire DataGrid:

<DataGrid ContextMenu="{StaticResource ColumnChooserMenuDataGrid}"
          PreviewMouseRightButtonUp="DataGrid_PreviewMouseRightButtonUp">
   ...
</DataGrid>

Write event handler:

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;
}

Where VisualHelper is:

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;
    }
}

Upvotes: 1

Related Questions