15

我有一个包含许多行和列的 WPF 网格,所有行和列都包含诸如 TextBlocks 和 TextBoxes 之类的东西。

对于这种特定情况,我希望第 1 列中的所有内容都有填充,并且第 2 列中的所有内容都正确对齐。必须在网格中的每个项目上设置这些属性似乎是非常非 WPF 的。

我知道我可以通过执行以下操作为网格中的所有 TextBlocks 创建样式:

<Grid>
  <Grid.Resources>
    <Style TargetType="{x:Type TextBox}">
      <Setter Property="HorizontalAlignment" Value="Right"/>
    </Style>
  </Grid.Resources>
</Grid>

但是有没有办法将该样式仅应用于第 2 列中的控件?

我应该使用不同的控件吗?

4

2 回答 2

24

这是我通常做的:

<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource {x:Type TextBlock}}">
    <Style.Triggers>
        <Trigger Property="Grid.Column" Value="0">
            <Setter Property="Margin" Value="0,0,2,0" />
        </Trigger>

        <Trigger Property="Grid.Column" Value="2">
            <Setter Property="Margin" Value="20,0,2,0" />
        </Trigger>
    </Style.Triggers>
</Style>
于 2009-05-12T14:28:21.047 回答
1

您可以定义一些样式,如下所示,并将它们分配给您的 Column.ElementStyle 属性:

<Window.Resources>
       <Style x:Key="elementStyle" TargetType="TextBlock">
           <Setter Property="VerticalAlignment" Value="Center" />
           <Setter Property="Margin" Value="2,0,2,0" />
       </Style>

       <Style x:Key="rightElementStyle" BasedOn="{StaticResource elementStyle}" TargetType="TextBlock">
           <Setter Property="HorizontalAlignment" Value="Right" />
       </Style>

       <Style x:Key="centerElementStyle" BasedOn="{StaticResource elementStyle}" TargetType="TextBlock">
           <Setter Property="HorizontalAlignment" Value="Center" />
       </Style>
</Window.Resources>

<dg:DataGrid AutoGenerateColumns="False">
      <dg:DataGrid.Columns>
           <dg:DataGridTextColumn Binding={Binding Path=Name} 
                                  Header="Name" 
                                  ElementStyle="{StaticResource centerElementStyle}"/>
           <dg:DataGridTextColumn Binding={Binding Path=Amount} 
                                  Header="Amount" 
                                  ElementStyle="{StaticResource rightElementStyle}"/>
    </dg:DataGrid.Columns>
</dg:DataGrid>
于 2009-05-12T08:41:31.160 回答