Все еще дурачусь с WPF и учусь на ходу. Попытка создания динамической группы элементов управления (в основном кнопок, но может включать флажки и другие).
Я понятия не имел, как лучше всего это сделать, поэтому я попытался создать стиль ItemsControl, а затем добавить элементы в ItemsPresenter внутри WrapPanel. Вскоре понял, что элементы не будут обернуты, потому что они фактически не были внутри 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. Не могу
явно изменить коллекцию Children для Panel, которая используется как ItemsPanel для
ItemsControl. ItemsControl генерирует дочерние элементы для Panel. ошибка
в объекте 'System.Windows.Controls.ItemsPresenter'.
Итак, каков наилучший способ сделать что-то подобное (хотелось бы иметь возможность просто бросать кнопки и другие элементы управления в ItemControl и составить очень хороший набор). Было бы лучше поместить элементы управления в какую-то коллекцию и повторять.
Хотелось бы сделать это красиво, но мои навыки в WPF все еще отсутствуют. Есть ли в WPF книги, которые преподносят не только основы, но и показывают, как профессионалы действительно это делают?