WPF ItemsControl元素 - 根据窗口大小调整内容大小(锚定)

时间:2015-10-27 09:25:17

标签: c# wpf data-binding grid itemscontrol

我正在使用wpf,我有一个问题,我想将一个集合绑定到一个元素,该元素根据窗口大小调整其内容的大小。

让一个小例子更清楚: 对于静态行为,我会做那样的事情。

<Grid Margin="10,10,10,10">
    <Grid.RowDefinitions>
        <RowDefinition Height="50*"/>
        <RowDefinition Height="50*"/>
        <RowDefinition Height="50*"/>
        <RowDefinition Height="50*"/>
    </Grid.RowDefinitions>
    <Button Grid.Row="0"></Button>
    <Button Grid.Row="1"></Button>
    <Button Grid.Row="2"></Button>
    <Button Grid.Row="3"></Button>
</Grid>

在这种情况下,所有按钮都会随窗口增长/缩小。

但现在我希望它更有活力。 我有一个ObservableCollection,它包含要添加的所有元素(动态数量)。 对于第一个实现,我已将所有元素添加到StackPanel。但StackPanel中的控件可以调整大小,以便我考虑使用网格。

实际解决方案:

<Window.Resources>
    <DataTemplate DataType="{x:Type local:OwnObject}">
        <Button DataContext="{Binding}" Content="{Binding Text}" Margin="0,0,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
    </DataTemplate>
</Window.Resources>
<Grid>
    <ItemsControl ItemsSource="{Binding SubItems}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel x:Name="stackPanel" Margin="0,0,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</Grid>

如何使用ItemsControl为每个元素生成一行并将其添加到该行?其他解决问题的解决方案也是受欢迎的。

1 个答案:

答案 0 :(得分:1)

您可以将UniformGrid用作ItemsPanelTemplate,因为它是网格中所有单元格大小相同的网格。所以代码看起来就像那样。

<ItemsControl Name="icTest" VerticalContentAlignment="Stretch">
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="{x:Type local:OwnObject}">
            <DockPanel Margin="0">
                <Button Content="{Binding Text}" Margin="0,0,0,0"
                        HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
            </DockPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="1" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

在它背后的代码中看起来就像那样。

    public class OwnObject : INotifyPropertyChanged
    {
        private string _text;

        public string Text
        {
            get { return _text; }
            set { _text = value; NotifyPropertyChanged( "Text" ); }
        }

...

    }

...

    ObservableCollection<OwnObject> objects = new ObservableCollection<OwnObject>();
    objects.Add( new OwnObject() { Text = "first" } );
    objects.Add( new OwnObject() { Text = "second" } );
    objects.Add( new OwnObject() { Text = "third" } );
    icTest.ItemsSource = objects;