我如何隐藏/删除一个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;
        }
 }

我如何隐藏/删除一个WPF ColumnHeaderStyle列标题

这是一个棘手的问题,所以请耐心等待。额外的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复制粘贴默认的。