我有一个生成按钮的 WPF ItemsControl。这些按钮有两侧,一侧用于显示商品名称,另一侧用于显示其价格。我的问题是,网格列(参见下面的代码)似乎没有正确扩展到它们所在按钮的整个宽度和高度,即使按钮本身扩展到整个宽度,它们也只是停留在中心以及 UniformGrid 单元格的高度。以名称为“Item 1”且价格为“56.00 Kč”的商品为例:
唯一有效的方法是在 TextBlock 之间添加边距或填充,但它们仍然没有像我希望的那样正确对齐。有人有什么想法吗?
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Margin="{Binding DataContext.MarginBetweenButtons, RelativeSource={RelativeSource AncestorType=ItemsControl}}" IsEnabled="{Binding Enabled}"
Command="{Binding Path=DataContext.ButtonClickedCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
CommandParameter="{Binding}"
Background="{Binding Color}"
HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
<Button.ContentTemplate>
<DataTemplate>
<Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Text="{Binding DataContext.Name, RelativeSource={RelativeSource AncestorType=Button}}"
FontSize="{Binding DataContext.FontSize, RelativeSource={RelativeSource AncestorType=Button}}"
TextWrapping="Wrap" TextAlignment="Center" Margin="0" Padding="0" VerticalAlignment="Center" HorizontalAlignment="Center"
Foreground="{Binding DataContext.TextColor, RelativeSource={RelativeSource AncestorType=Button}}"/>
<TextBlock Grid.Column="1" Visibility="{Binding DataContext.PriceText, Converter={StaticResource textToVisibility}, RelativeSource={RelativeSource AncestorType=Button}}"
Text="{Binding DataContext.PriceText, RelativeSource={RelativeSource AncestorType=Button}}"
FontSize="{Binding DataContext.FontSize, RelativeSource={RelativeSource AncestorType=Button}}"
TextWrapping="NoWrap" TextAlignment="Right" Margin="0,0,0,0" Padding="0,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Right"
Foreground="{Binding DataContext.TextColor, RelativeSource={RelativeSource AncestorType=Button}}" />
</Grid>
</DataTemplate>
</Button.ContentTemplate>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
我尝试更改垂直和水平对齐方式进行拉伸,创建仅包含虚拟文本且没有其他值的文本框(然后慢慢添加回值),更改按钮的属性以使其保持简单状态,并将 UniformGrid 配置为像带有嵌套 UniformGrid 的网格可创建列跨度效果。这一切都没有结果。
问题是
Button
默认情况下将内部 ContentPresenter
居中(显示您的 ContentTemplate
)。因此,虽然您的根 Grid
的对齐设置正确,但其父级 ContentPresenter
仍将居中且不会拉伸。
请参阅 WPF 默认模板此处。具体来说:
<ContentPresenter Margin="2"
HorizontalAlignment="Center"
VerticalAlignment="Center"
RecognizesAccessKey="True" />
解决方案是完全重新模板按钮。一个好方法是从上面链接的默认模板中复制模板,然后修改它以满足您的需要。您可以将上面的内容更改为:
,而不是让模板过于定制 <ContentPresenter Margin="2"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="True" />
然后在每个特定的
HorizontalContentAlignment
(或其样式)上设置 VerticalContentAlignment
和 Button
属性,并保持 ContentTemplate
相同。