2017-09-08 159 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在屁股疼痛,你將不得不做解決方法... –