为什么按钮的 DataTemplate 内的 WPF 网格无法正确拉伸?

问题描述 投票:0回答:1

我有一个生成按钮的 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 的网格可创建列跨度效果。这一切都没有结果。

c# wpf button datatemplate wpf-grid
1个回答
0
投票

问题是

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
相同。

© www.soinside.com 2019 - 2024. All rights reserved.