2017-09-08 140 views
1

我是c#的新手,并在WPF UI上寻找帮助。WPF datagridtextcolumn垂直内容对齐不起作用

1)我想我的数据网格的内容都显示在列的中心。

2)为了在UI中看起来很漂亮,我需要datagridtextboxcolumn和 datagridtemplatecolumn(组合框)宽度和高度适合列。

目前,我已经通过Stretch VerticalAlignment和Horizo​​ntalAlignment实现了Content Presenter的样式,它使数据适合列的宽度和高度。

在设置TextBlock.TextAlignment的setter属性后,它成功显示数据水平居中。

但是,即使我已将垂直内容对齐的setter属性设置为居中,数据仍未在垂直中心显示。

所以,我需要专家给我一些建议,使数据显示在垂直和水平中心,并拉伸宽度高度以适合列。

下面是我的代码风格

<Style x:Key="Body_Content_DataGrid_Centering" 
    TargetType="{x:Type DataGridCell}"> 
     <Setter Property="TextBlock.TextAlignment" Value="Center" /> 
     <Setter Property="VerticalContentAlignment" Value="Center" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type DataGridCell}"> 
        <Grid Background="{TemplateBinding Background}"> 
         <ContentPresenter VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

及以下是我的DataGrid实现代码:

<DataGrid x:Name="dataGridAccount" RowHeight="27" MinRowHeight="50" ColumnHeaderHeight="50" MinColumnWidth="150" RowHeaderWidth="0" Margin="0" Grid.Row="1" AutoGenerateColumns="False" CellStyle="{StaticResource Body_Content_DataGrid_Centering}" VerticalContentAlignment="Bottom"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding username}" ClipboardContentBinding="{x:Null}" Header="Username" Width="1*"> 
       <DataGridTextColumn.HeaderStyle> 
        <Style TargetType="{x:Type DataGridColumnHeader}"> 
         <Setter Property="HorizontalContentAlignment" Value="Center"/> 
        </Style> 
       </DataGridTextColumn.HeaderStyle> 
      </DataGridTextColumn> 
      <DataGridTemplateColumn Header="Entry Level" Width="1*"> 
       <DataGridTemplateColumn.HeaderStyle> 
        <Style TargetType="{x:Type DataGridColumnHeader}"> 
         <Setter Property="HorizontalContentAlignment" Value="Center"/> 
        </Style> 
       </DataGridTemplateColumn.HeaderStyle> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding entryLevel}" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
       <DataGridTemplateColumn.CellEditingTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{StaticResource entryLevel}" 
                SelectedItem="{Binding entryLevel}" Margin="0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellEditingTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

当前结果: http://imgur.com/a/BfJrC

预期结果: http://imgur.com/a/v8v8a

英语不是我的母语,请原谅我的错误。

谢谢先进。

回答

0

我想,GridCells内的Textblock没有占用整个单元格的空间。您为GridCell设置VerticalAlignment="Stretch" HorizontalAlignment="Stretch",但不为此Cell内的TextBlock设置。因此,您应该将这两个对齐添加到单元格内的TextBlock样式。

+0

设置VerticalAlignment={TemplateBinding VerticalContentAlignment}但我可以看到文本块已经采取绵延VerticalAlignment和Horizo​​ntalAligment的效果如图http://imgur.com/a/dGVWw 只是我不知道为什么VerticalContentAlignment对文本块没有影响,因为你可以看到文本始终位于顶部。 – CM92

0

尝试在您的ContentPresenter

+1

嗨,代码在中心显示的文本块上工作,但它导致组合框不再适合列。任何建议?谢谢 – CM92

+0

提示?没有。解决方法,是的。尝试将DataGrid的RowHeight设置为某个值,然后将单元格中的ComboBox高度设置为相同的值。我很乐意帮助你以适当的方式做到这一点,将所有东西都放在一个地方,然后将它作为模板应用到单元格中,但据我所知,DataGrids中没有这种可能性。最近我一直在努力解决这个问题,并发现DataGrids的很多部分不能从ContentTemplate进行样式化,因为它们不能从Control类继承。基本上造型DataGrid在屁股疼痛,你将不得不做解决方法... –