2011-10-17 38 views
50

我正在使用WPF4.0 DataGrid。雙擊新行中的單元格時,一切正常除非我已將單元格樣式添加到該列。例如,我有一個數字列,我想數據右對齊所以XAML看起來像這樣如何使WPF DataGrid單元格右對齊而不使新行上的可選區域變得很小?

<DataGridTextColumn Binding="{Binding Path=ImpaId}" 
        CellStyle="{StaticResource CellRightAlign}"> 
    <DataGridTextColumn.Header> 
      <TextBlock Style="{StaticResource DataGridHeader}">Impa</TextBlock> 
    </DataGridTextColumn.Header> 
</DataGridTextColumn> 

凡在共享資源的風格就是:

<Style x:Key="CellRightAlign"> 
    <Setter Property="Control.HorizontalAlignment" 
      Value="Right" /> 
</Style> 

產生的可選區域上一個新的行在圖像中顯示爲小藍色區域。這是用戶擊中的非常小的目標,並且這恰好是他們希望在新行開始的最可能的列。

DataGrid cell with tiny width

如果我刪除CellStyle,面積爲工作所需,但當然我失去了右對齊。

DataGrid cell with proper width

有誰知道如何實現兩者兼而有之?

事情我想

  1. 在結合一些寬度的格式設置TargetNullValue。 這適用於現有的行,但對新行沒有影響。
  2. 在列上設置MinWidth,這並不影響新行的寬度,可選 區域。

東西合作:

通過@AngelWPF使用從答案的信息我能使用CellStyle改爲使用ElementStyle如下:

<DataGridTextColumn Binding="{Binding Path=ImpaId}" 
        CellStyle="{StaticResource CellRightAlign}"> 

成了

<DataGridTextColumn Binding="{Binding Path=ImpaId}" 
        ElementStyle="{StaticResource CellRightAlign}"> 
+0

類似的問題,但不知道答案: http://stackoverflow.com/questions/18378515/how-to-make-cell-to-take-full-width-when-aligned-to-right -or-left-in-wpf-grid – digz6666

回答

71

您可以應用ElementStyleDataGridTextColumn針對性,以TextBlock和右對齊的是,它會工作。

 <DataGridTextColumn Binding="{Binding Path=ImpaId}"> 
      <DataGridTextColumn.Header> 
       <TextBlock Style="{StaticResource 
            DataGridHeader}"> 
        Impa 
       </TextBlock> 
      </DataGridTextColumn.Header> 
      <DataGridTextColumn.ElementStyle> 
       <Style TargetType="{x:Type TextBlock}"> 
        <Setter Property="HorizontalAlignment" Value="Right" /> 
       </Style> 
      </DataGridTextColumn.ElementStyle> 
     </DataGridTextColumn> 
+0

我能夠通過在外部DataGridTextColumn中添加ElementStyle屬性來最小化代碼,並讓它使用我現有的CellRightAlign。謝謝。 – Tod

5

您可以嘗試解決:

  <DataGridTemplateColumn> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Grid Background="White" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
         <TextBlock HorizontalAlignment="Right" Text="{Binding Path=ImpaId}"/> 
        </Grid> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
5

我只是有一個類似的問題,並通過覆蓋Blend中的DataGridCell的樣式找到了另一種解決方案。

更改的項目從原來的風格是在風格本身伸展電池本身和VerticalAlignment="Center"HorizontalAlignment="Right"在模板屬性來對齊內容VerticalAlignmentVerticalContentAlignment的制定者。將這些值更改爲任何需要對齊單元格內容的值。

其餘的風格可能被刪除,以便使用基本風格的設置(使用StaticResource風格是BasedOn)。然而,我將Blend製作的風格留給了我。

這導致XAML的代碼都被納入控制資源:

<Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource ResourceKey={x:Type DataGridCell}}"> 
    <Setter Property="VerticalAlignment" Value="Stretch" /> 
    <Setter Property="VerticalContentAlignment" Value="Stretch" /> 

    <!-- Additional styles, can be removed to fall back to base styles --> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="BorderBrush" Value="Transparent"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> 
        <ContentPresenter 
         ContentTemplate="{TemplateBinding ContentTemplate}" 
         Content="{TemplateBinding Content}" 
         ContentStringFormat="{TemplateBinding ContentStringFormat}" 
         SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
         VerticalAlignment="Center" 
         HorizontalAlignment="Right" 
         /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/> 
      <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> 
     </Trigger> 
     <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
      <Setter Property="BorderBrush" Value="{DynamicResource {ComponentResourceKey ResourceId=FocusBorderBrushKey, TypeInTargetAssembly={x:Type DataGrid}}}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
9

只想添加爲將來的代碼搜索更多的例子。

我把這個XAML文件的頂部:

<UserControl.Resources> 
    <Style TargetType="{x:Type TextBlock}" x:Key="RightCell"> 
     <Setter Property="Background" Value="{Binding Included, Converter={StaticResource BoolToColorConverter}}"/> 
     <Setter Property="HorizontalAlignment" Value="Stretch"/> 
     <Setter Property="TextAlignment" Value="Right"/> 
    </Style> 
</UserControl.Resources> 

然後在DataGrid:

<DataGridTextColumn Header="Excluded" Binding="{Binding Excluded}" ElementStyle="{StaticResource RightCell}"/> 

這一權利對齊文本和排序仍處於啓用狀態。文本框填充單元格,在這種情況下使用bool轉換器進行着色。

+0

完美而簡單的「ElementStyle」賦值。 – DRapp

相關問題