【发布时间】:2011-03-09 02:19:55
【问题描述】:
我仍然在使用 WPF 并边走边学。现在尝试构建控件的动态分组(主要是按钮,但可能包括复选框和其他)。
我不知道最好的方法是什么,所以我尝试创建一个 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 为 Panel 生成子元素。错误 在对象'System.Windows.Controls.ItemsPresenter'。
那么做这样的事情的最好方法是什么(希望能够将按钮和其他控件扔到 ItemControl 中,并且排队真的很好)。将控件放入某种集合并进行迭代会更好吗?
很想把它做好,但我的 WPF 技能仍然缺乏。是否有任何 WPF 书籍可以教授基础知识并展示专业人士如何真正做到这一点?
【问题讨论】:
标签: wpf styles itemscontrol itemspanel itemspresenter