【问题标题】:How can I hide/remove a WPF ColumnHeaderStyle column header?如何隐藏/删除 WPF ColumnHeaderStyle 列标题?
【发布时间】:2015-08-12 19:43:16
【问题描述】:

我有一个 DataGrid ColumnHeaderStyle 问题,在我的情况下,我想将这些组件(文本块,按钮)添加到所有列标题,但也生成了错误/假列标题,因此出现列及其标题(剂量 + Btn ,Drug + Btn,Patient + Btn,Date + 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;
        }
 }

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-07
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多