对齐控件的大小

时间:2010-08-02 06:13:02

标签: .net wpf

简化问题。

我有两个ItemsControl,它们位于另一个之下并且绑定到相同的序列:

[Control] [Another Control] [More Controls]
[Other Ctrl] [Super Control] [Control]

我想要做的是调整它们的尺寸,使它们看起来像是一张桌子:

[Control   ] [Another Control] [More Controls]
[Other Ctrl] [Super Control  ] [Control      ]

“单向”也是可以接受的:使底部物品与顶部物品相同,即使它们更短:

[Control] [Another Control] [More Controls]
[Other C] [Super Control  ] [Control      ]

一些注意事项:

  1. 是的,他们 在单独的ItemControl中。
  2. 不,我无法使用GridDataGrid
  3. 我完全拥有后端数据结构(如果有帮助)
  4. 有关更完整的说明,可以参考我的other question

    更新:为什么他们必须在不同的ItemControls
    一般来说,我想要实现的是构建一个绑定到矩形数据结构的表。除了使用嵌套的ItemControl之外,我没有看到任何其他方法:行{1} ItemControl,每行包含该行中单元格的另一个ItemControl。反之亦然:一个用于列,每个项目包含该列中的单元格。无论哪种方式,嵌套项目都必须彼此对齐 我确实意识到可能有其他方法来创建我看不到的这样一个表。这也是我问other question

    的原因

    先谢谢哦,全能的社区。

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

 <StackPanel Grid.IsSharedSizeScope="True">
    <StackPanel.Resources>
        <DataTemplate x:Key="SharedSizeTemplate">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="SharedSize"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding}"/>
            </Grid>
        </DataTemplate>
    </StackPanel.Resources>
    <ItemsControl ItemTemplate="{StaticResource SharedSizeTemplate}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <System:String>One</System:String>
        <System:String>Longer</System:String>
        <System:String>Longest</System:String>
        <System:String>Very Longest</System:String>
    </ItemsControl>
    <ItemsControl ItemTemplate="{StaticResource SharedSizeTemplate}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <System:String>Short</System:String>
        <System:String>S</System:String>
        <System:String>Even longer than above</System:String>
        <System:String>V</System:String>
    </ItemsControl>
</StackPanel>

编辑:虽然还有一个问题 - 所有列的大小都会达到相同的最佳宽度 - 不知道你是否可以接受它?

答案 1 :(得分:0)

我最近遇到过类似的问题,最后我用自己的简单hack for datatemplate使用dockpanel这样做:

<DockPanel VerticalAlignment="Center" HorizontalAlignment="Stretch" LastChildFill="True">
    <TextBox DockPanel.Dock="Right" Width="40" Text="{Binding CurrentValue}"></TextBox>
    <Slider DockPanel.Dock="Right" Width="60" ...></Slider>
    <TextBlock DockPanel.Dock="Right" Text="{Binding Header}"></TextBlock>
</DockPanel>

如果您可以决定几乎所有的控件,那么您可以使用这个想法。 width,或者在必要时创建嵌套滚动视图。