Все еще обманывать WPF и учиться, когда я иду. Теперь попытаемся создать динамическую группировку элементов управления (в основном кнопки, но могут включать CheckBox и другие).WrapPanel как ItemPanel для ItemsControl
Я понятия не имел, что это лучший способ сделать это, поэтому я попытался создать стиль 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' object cannot be added to 'WrapPanel'. Cannot explicitly modify Children collection of Panel used as ItemsPanel for ItemsControl. ItemsControl generates child elements for Panel. Error at object 'System.Windows.Controls.ItemsPresenter'.
Так что самый лучший способ сделать что-то вроде этого (очень хотелось бы иметь возможность просто выбросить кнопки и другие элементы управления в ItemControl и выстраиваться замечательно) , Было бы лучше поставить Controls в какую-то коллекцию и повторить ее.
Хотел бы, чтобы это было хорошо сделано, но мои навыки WPF по-прежнему не хватает. Есть ли какие-либо книги WPF, которые преподают за пределами основ и показывают, как профессионалы действительно это сделают?
Это работает, но я не хочу устанавливать его в стиле, а не в каждом ItemsControl. Я думал, что это возможно с собственностью IsItemsHost, но, похоже, не работает. Это единственный способ? –
Обновленный ответ со стилем для ItemsControl – Arcturus
Ах, конечно, я могу просто добавить в этот стиль, спасибо. Если у вас есть время, вы можете посмотреть на 2 других вопроса, которые у меня есть, которые до сих пор не решены. http://stackoverflow.com/questions/3118266/wpf-datatemplate-property-set-at-content http://stackoverflow.com/questions/3004967/how-to-reuse-layouts-in-wpf –