如何防止ItemsControl水平拉伸以适合儿童

时间:2014-05-15 07:50:21

标签: wpf xaml

我有一个ItemsControl,没什么特别的: -

<ItemsControl ItemsSource="{Binding ...}"
              ItemTemplate="{StaticResource ...}" />

ItemTemplate包含以下XAML: -

<Border BorderThickness="0,0,0,1"
        BorderBrush="LightGray"
        Padding="0,2,0,2">
    <Grid>
        <Grid.ColumnDefinitions>
             <ColumnDefinition Width="*"
                               SharedSizeGroup="Prompt" />
             <ColumnDefinition Width="Auto" />
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0"
                   Text="{Binding ...}" />
        <NumericUpDown Grid.Column="1"
                       Width="75"
                       Text="{Binding ...}" />
    </Grid>
</Border>

这会生成如下所示的UI: -

enter image description here

但是如果TextBlock中的文本很长,它会将NumericUpDown从r.h中推出。 ItemsControl的边缘,例如: -

enter image description here

我希望一旦NumericUpDown被“推高”对抗r.h.如果ItemsControl的边缘,TextBlock将开始被截断。我假设当前行为是由于ItemsControl使用StackPanel作为其项目演示者。我怎样才能让它做我想做的事?

3 个答案:

答案 0 :(得分:1)

当您使用SharedSizeGroup Grid.IsSharedSizeScope="True"时,该列的星号大小被视为Auto,更多不是官方信息here

IsSharedSizeScope不应用于排列问题中描述的控件。您应删除所有SharedSizeGroup个属性,并将ItemsControl's HorizontalAlignment设置为Left

答案 1 :(得分:0)

我认为您可能想尝试在Stretch上设置Control.HorizontalContentAlignment PropertyItemsControl。根据链接页面,这个:

  

获取或设置控件内容的水平对齐方式。

简单来说,这意味着它应该将呈现的子项或项目的Width设置为与Width相同的ItemsControl

答案 2 :(得分:0)

在经历了很多遇到死胡同之后我想通过改变ItemsPresenter或ItemsPanel来解决这个问题,我最终在我的ItemTemplate中使用了DockPanel而不是网格: -

<Border BorderThickness="0,0,0,1"
        BorderBrush="LightGray"
        Padding="0,2,0,2">
    <DockPanel LastChildFill="true">
        <NumericUpDown DockPanel.Dock="Right"
                       Width="75"
                       Text="{Binding ...}" />

        <TextBlock Text="{Binding ...}" />
    </DockPanel>
</Border>

我不完全确定为什么DockPanel尊重父ItemsControl的大小,而Grid很高兴从边缘水平“溢出”。这是WPF的一个方面,我仍然在努力 - 控制'大小受父母的影响,并受到孩子大小的影响!