如何使用网格填充数据网格文本列标题中的所有空格?

时间:2014-01-03 15:46:49

标签: wpf xaml grid-layout

我对wpf非常陌生,我在列标题中遇到了一些格式问题。我想要一个带有我的标题的Textblock,以及我的标题中最终将成为过滤器功能的按钮。我到目前为止所写的内容:

<DataGrid ItemsSource="{Binding diagrams}" SelectedItem="{Binding selectedDiagram, Mode=TwoWay}" AutoGenerateColumns="False" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0,25,0,0" Height="450" Width="746">
        <DataGrid.Columns>
            <DataGridTextColumn Width="Auto" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Binding="{Binding iD}">
                <DataGridTextColumn.Header>
                    <Grid>                         # <--Problems in here
                        <Grid.ColumnDefinitions>   #
                            <ColumnDefinition/>    #
                            <ColumnDefinition/>    #
                        </Grid.ColumnDefinitions>  #
                        <TextBlock Text="ID" HorizontalAlignment="Left" Grid.Column="0"/>
                        <Button Content="^" HorizontalAlignment="Right" Grid.Column="1"/>
                    </Grid>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
            <DataGridTextColumn Header="Description" Width="Auto" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Binding="{Binding description}"/>
            <DataGridTextColumn Header="Date Changed" Width="Auto" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Binding="{Binding dateChanged}"/>
            <DataGridTextColumn Header="Created By" Width="Auto" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Binding="{Binding createdBy}"/>
            <DataGridTextColumn Header="Type" Width="Auto" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Binding="{Binding type}"/>
        </DataGrid.Columns>
    </DataGrid>

最终网格只占用最小所需空间并直接并排标题和按钮。正如您在文本块和按钮中的对齐方式所猜测的那样,我希望它们位于列标题的两侧,或者至少稍微分开。

我意识到网格不能用星星来填充可用空间,堆叠面板或停靠板也不能(我的直觉告诉我,我已经得到了一些有趣的错误,但我又是一个新的想法)

我无法真正规定标题或网格的标准大小,因为填充列的文本可能会有很大的变化,尽管我付出了最大的努力,但仍然找不到强制网格填充的方法空的空间。任何人都可以帮忙吗?最好用小字?

3 个答案:

答案 0 :(得分:2)

我有一个稍微改进的答案,这帮助了我,并且更简单/更清洁。

在列上,设置HeaderStyle ......对于您的示例,它将如下所示:

                                        <DataGridTextColumn.HeaderStyle>
                                            <Style TargetType="{x:Type DataGridColumnHeader}">
                                                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                                            </Style>
                                        </DataGridTextColumn.HeaderStyle>

没有必要的模板,它会延伸到填充。

答案 1 :(得分:1)

我不认为这会直接起作用。尝试使用样式并将Grid的宽度绑定为

  

DataGridColumnHeader Style

<Style x:Key="StarLengthHeader" TargetType="{x:Type DataGridColumnHeader}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                    <Grid Width="{TemplateBinding Width}">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="Auto"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="ID" HorizontalAlignment="Left" Grid.Column="0"/>
                        <Button Content="^"  HorizontalContentAlignment="Left" HorizontalAlignment="Right" Grid.Column="2"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
  

DataGridColumnHeader

 <DataGridTextColumn HeaderStyle="{StaticResource StarLengthHeader}"  Width="*" CanUserReorder="True" CanUserResize="True" CanUserSort="True" Binding="{Binding iD}" />

我希望这会很好。

  

输出

Output

答案 2 :(得分:0)

您是否尝试过使用网格进行布局,添加一个可以处理调整大小的中间列?

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="Auto"/>
  <ColumnDefinition Width="*"/>
  <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>

然后将文本块放在第0列,将按钮放在第2列

编辑:虽然我很感激这可能不起作用,因为我已经使用DataGrids获得各种乐趣,并试图调整列的大小......