2012-02-24 68 views
2

我创建了一个像控件一样的网格,并且我使用itemscontrol来表示一行,另一个itemcontrol将这些行放在一起。Itemscontrol水平定位项目,并使子项伸展到堆叠面板宽度

<ItemsControl ItemsSource="{Binding CellRows}" Grid.Row="1" Grid.Column="1" Margin ="20"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <ItemsControl ItemsSource="{Binding}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Horizontal" Background="Cyan"/> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <TextBox Text="{Binding Content}"/> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

默认情况下,我希望我的StackPanel采取其父已经和这种情况发生的大小:在一排,所以我用一个StackPanel有这样的水平方向的项目被水平放置。但我还希望itemscontrol中的所有子项(使用stackpanel作为项目面板)占用其父项的全部宽度。但是这并没有发生。

我读过这也是一个stackpanel的默认行为。

我的问题:

1)是否有占用我的StackPanel(父)的整个宽度没有办法让我的文本框(孩子)?我不知道堆栈面板将包含多少项目,所以我不能给文本框设置默认宽度。

2)是否有其他用于表示2D数据的内容? (我正在使用silverlight 4 MVVM)

在此先感谢。

+0

如果我们退后一步,你会说网格的约束是什么?你想要固定的列数,行数?你想滚动吗?你想修正单元格大小吗? – Slugart 2012-02-24 13:18:42

+0

@Slugart:网格会限制我使用动态的行和列。我不想在网格中放置每件物品,因为我不知道这里有多少物品:它可以是3x3或9x9。 – Terry 2012-02-24 13:22:00

+0

我猜你不希望网格滚动,而是调整一致的单元格? – Slugart 2012-02-24 13:24:20

回答

2

退房的UniformGrid为SL控制这里:http://www.jeff.wilcox.name/2009/01/uniform-grid/

的UniformGrid从MSDN的定义是:“提供一种方法来安排在网格中的内容,其中在网格中的所有单元都具有相同的尺寸。”

如果您希望将其绑定到可观察集合,只需将UniformGrid作为UniformGrid extends Panel放置在ItemsControl的ItemsPanelTemplate中即可。

+0

@djerry更新答案,以考虑到绑定。 – Slugart 2012-02-24 14:29:53

+0

这个uniformgrid帮助我在我的路上! – Terry 2012-03-02 08:46:54