WPF Grid - Как применить стиль только для одного столбца?
У меня есть WPF Grid со множеством строк и столбцов, содержащих такие вещи, как TextBlocks и TextBoxes.
Для этой конкретной ситуации я хочу, чтобы все элементы в столбце 1 имели отступы, а все элементы в столбце 2 были выровнены вправо. Кажется, что не нужно WPF устанавливать эти свойства для каждого элемента в сетке.
Я знаю, что могу создать стиль для всех TextBlocks в сетке, сделав что-то вроде этого:
<Grid>
<Grid.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="HorizontalAlignment" Value="Right"/>
</Style>
</Grid.Resources>
</Grid>
Но есть ли способ применить этот стиль только к элементам управления, скажем, в столбце 2?
Должен ли я использовать другой элемент управления?
2 ответа
Решение
Вот что я обычно делаю:
<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>
Вы можете определить некоторые стили, как показано ниже, и назначить их свойству 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>