WrapPanel作为ItemsControl的ItemPanel

时间:2010-06-28 11:26:58

标签: wpf styles itemscontrol itemspanel itemspresenter

仍在和WPF一起玩,并在我学习的同时学习。现在尝试构建一个动态的控件分组(主要是按钮,但可能包括CheckBoxes和其他)。

我不知道最好的方法是什么,所以我尝试创建ItemsControl样式,然后将项目添加到WrapPanel内的ItemsPresenter中。很快意识到这些项目不会换行,因为它们实际上不在WrapPanel中,除非我把它作为ItemsHost。像这样:

<Style x:Key="ButtonPanelGroup" TargetType="{x:Type ItemsControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ItemsControl}">
                <Border CornerRadius="5"
                        BorderBrush="{StaticResource DarkColorBrush}"
                        BorderThickness="1"
                        Margin="5">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>

                        <WrapPanel IsItemsHost="True" FlowDirection="LeftToRight">
                            <ItemsPresenter />
                        </WrapPanel>

                        <ContentPresenter ContentSource="Name" Grid.Row="1" />

                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

请注意,这是一项正在进行的工作,我仍需要实现许多样式效果。我在这里使用它:

<UniformGrid Rows="1">
    <ItemsControl Name="Group1" Style="{StaticResource ButtonPanelGroup}">
        <Button>Button1</Button>
        <Button>Button2</Button>
        <CheckBox>TickBox</CheckBox>
    </ItemsControl>

    <ItemsControl Name="Group2" Style="{StaticResource ButtonPanelGroup}">
        <Button>Button3</Button>
        <Button>Button4</Button>
        <Button>Button5</Button>
    </ItemsControl>

    <ItemsControl Name="Group3" Style="{StaticResource ButtonPanelGroup}">
        <Button>Button6</Button>
        <Button>Button7</Button>
        <Button>Button8</Button>
    </ItemsControl>
</UniformGrid>

另请注意,这仍然是一项正在进行中的工作,因为UniformGrid不会成为这里的方式,而且边距可能会很痛苦(有没有重叠的边距?)所以输入会受到赞赏。

现在到了真正的问题。这不起作用我收到错误:

  

'ItemsPresenter'对象无法添加到'WrapPanel'。不能   显式修改用作ItemsPanel的Panel的Children集合   ItemsControl的。 ItemsControl为Panel生成子元素。错误   在对象'System.Windows.Controls.ItemsPresenter'。

那么做这样的事情的最佳方式是什么(希望能够将按钮和其他控件扔进ItemControl并且排队真的很棒)。将控件放入某种集合并迭代会更好吗。

很想完成它,但我的WPF技能仍然缺乏。是否有任何WPF书籍超出了基础知识,并展示专业人士将如何真正做到这一点?

3 个答案:

答案 0 :(得分:44)

您可能需要查看ItemsPanel属性:

  

获取或设置用于定义控制项布局的面板的模板。

示例:

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

您可以按如下方式设置样式:

<Style TargetType="ItemsControl">
    <Setter Property="ItemsPanel">
      <Setter.Value>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>

答案 1 :(得分:3)

不要忘记线索属性的定义IsItemsHost =&#34; True&#34;。 否则,您的ItemsControl不会显示您的商品。

<ListBox ItemsSource="{Binding MyItemsSource}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate >
                <WrapPanel IsItemsHost="True"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ListBox>

答案 2 :(得分:0)

这是慢速DataGrid / xceed datagrid和WrapPanel解决方案的另一个简单替代方案。当大量数据或整个表仅用于编辑时,可能会很有用。 使用ItemsControl + Grid.IsSharedSizeScope =“ True”

更多信息在这里:https://wpf.2000things.com/tag/issharedsizescope/ +关于ItemsControl虚拟化性能:Virtualizing an ItemsControl?

<Grid Grid.IsSharedSizeScope="True" Margin="0,30,0,0">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition MinWidth="50" Width="Auto" SharedSizeGroup="Id" />
            <ColumnDefinition MinWidth="50" Width="Auto" SharedSizeGroup="Time"  />
        </Grid.ColumnDefinitions>
        <Border Grid.Column="0" >
            <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" Text="Header1" />
        </Border>
        <Border Grid.Column="1" >
            <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" Text="Header2" />
        </Border>
    </Grid>

    <ItemsControl Grid.Row="1" ItemsSource="{Binding RunInstance.ConcentrationGradient.Steps}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition MinWidth="50" Width="Auto" SharedSizeGroup="Id" />
                        <ColumnDefinition MinWidth="50" Width="Auto" SharedSizeGroup="Time" />
                    </Grid.ColumnDefinitions>
                    <Border Grid.Column="0">
                        <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" Text="{Binding Index, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
                    </Border>
                     <Border Grid.Column="1">
                        <TextBlock VerticalAlignment="Center" TextWrapping="NoWrap" Text="{Binding Time, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
                    </Border>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>