如何将右键单击上下文菜单添加到WPF 4 DataGrid的列标题?
我希望DataGrid列标题的上下文菜单与其他单元格不同。因此,使用常规ContextMenu属性是行不通的。存在DataGrid.RowHeaderTemplate,但我找不到DataGrid.ColumnHeaderTemplate如何将右键单击上下文菜单添加到WPF 4 DataGrid的列标题?,wpf,wpfdatagrid,Wpf,Wpfdatagrid,我希望DataGrid列标题的上下文菜单与其他单元格不同。因此,使用常规ContextMenu属性是行不通的。存在DataGrid.RowHeaderTemplate,但我找不到DataGrid.ColumnHeaderTemplate 编辑/注意:列是动态生成的。这取决于生成列的方式,如果在XAML中定义列,则可以执行以下操作: <DataGrid DataContext="{Binding MyDataContext}" ItemsSource="{Binding MyItems}"
编辑/注意:列是动态生成的。这取决于生成列的方式,如果在XAML中定义列,则可以执行以下操作:
<DataGrid DataContext="{Binding MyDataContext}" ItemsSource="{Binding MyItems}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Age}" Header="Age" >
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{TemplateBinding Content}" >
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="Task _1" />
<MenuItem Header="Task _2" />
<MenuItem Header="Task _3" />
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
为所有DataGridColumnHeader设置一个通用样式:
<DataGrid.Resources>
<ContextMenu x:Key="DataGridColumnHeaderContextMenu" ...>
</ContextMenu>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="ContextMenu"
Value="{StaticResource DataGridColumnHeaderContextMenu}" />
</Style>
</DataGrid.Resources>
如果要为不同的列标题使用不同的上下文菜单,请使用触发器:
<DataGrid.Resources>
<ContextMenu x:Key="ColumnHeaderContextMenu1" ...>
</ContextMenu>
<ContextMenu x:Key="ColumnHeaderContextMenu2" ...>
</ContextMenu>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Style.Triggers>
<Trigger Property="Content" Value="Column1">
<Setter Property="ContextMenu"
Value="{StaticResource ColumnHeaderContextMenu1}" />
</Trigger>
<Trigger Property="Content" Value="Column2">
<Setter Property="ContextMenu"
Value="{StaticResource ColumnHeaderContextMenu2}" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
希望有帮助 如果您是动态生成列呢?对于动态列,第二种解决方案仍然有效,假设您事先知道列名。这仅在您直接右键单击文本块时有效,因此不理想。您可以通过设置HorizontalAlignment=“Stretch”使目标区域稍微大一点来对此进行改进。。。