我如何隐藏/删除一个WPF ColumnHeaderStyle列标题
本文关键字:一个 WPF ColumnHeaderStyle 标题 何隐藏 隐藏 删除 | 更新日期: 2023-09-27 18:07:51
我有一个DataGrid ColumnHeaderStyle问题,在我的情况下,我想将这些组件(textblock,按钮)添加到所有列标题中,但也生成了一个错误/假的列标题,因此显示其标题(剂量+ Btn,药物+ Btn,患者+ Btn,日期+ Btn),并加上一个没有标题名称的假列标题,其中只包含一个按钮-> " + Btn。Datagrid没有预定义的列。我的问题是我如何隐藏/删除/禁用或取消这个假列标题?任何建议吗?
XAML:<Window.Resources>
<Style x:Key="dgheaderstyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}" >
<StackPanel Orientation="Horizontal" >
<TextBlock Text="{Binding}" />
<Button Content="Click"></Button>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<DataGrid ItemsSource="{Binding}" ColumnHeaderStyle="{StaticResource dgheaderstyle}" HorizontalAlignment="Left" Height="262" Margin="10,21,0,0" VerticalAlignment="Top" Width="472">
</DataGrid>
</Grid>
背后的代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataTable table = new DataTable();
table.Columns.Add("Dosage", typeof(int));
table.Columns.Add("Drug", typeof(string));
table.Columns.Add("Patient", typeof(string));
table.Columns.Add("Date", typeof(DateTime));
table.Rows.Add(25, "Indocin", "David", DateTime.Now);
table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
DataContext = table;
}
}
这是一个棘手的问题,所以请耐心等待。额外的DataGridColumn头被命名为PART_FillerColumnHeader。它位于PART_ColumnHeadersPresenter中的ItemsPresenter后面。
DataGridTemplate的简化(不是它包含的全部,只是相关的部分)。
<ControlTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter"
Style="{StaticResource DataGridColumnHeaderStyle}"/>
<ScrollContentPresenter Grid.Row="1" x:Name="PART_ScrollContentPresenter" />
</Grid>
</ControlTemplate>
我们的兴趣是在DataGridColumnHeadersPresenter,让我们看看里面。
<Style x:Key="DataGridColumnHeadersPresenterStyle" TargetType="{x:Type DataGridColumnHeadersPresenter}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeadersPresenter}">
<Grid>
<DataGridColumnHeader x:Name="PART_FillerColumnHeader" IsHitTestVisible="False" />
<ItemsPresenter />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
现在DataGridColumnHeadersPresenter的ItemContainers类型是DataGridColumnHeader。当你分配一个ColumnHeaderStyle给你的DataGrid。它适用于DataGridColumnHeaderPresenter和PART_FillerColumnHeader的项。
如上所示,PART_FillerColumnHeader放置在ItemsPresenter后面。ColumnHeadersPresenter的Items被呈现到该ItemsPrsenter(意味着所有其他列标头)。这就是为什么你会看到额外的列标头。在列标头后面看到的额外列标头。
现在如何摆脱它。简单地给它分配一个它自己的样式。
你可以使用Blend复制粘贴默认的。