2010-06-28 4 views
25

Все еще обманывать 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, которые преподают за пределами основ и показывают, как профессионалы действительно это сделают?

ответ

39

Вы можете взглянуть на ItemsPanel собственности:

Gets or sets the template that defines the panel that controls the layout of items.

Пример:

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

И вы можете установить его в стиле следующим образом:

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

Это работает, но я не хочу устанавливать его в стиле, а не в каждом ItemsControl. Я думал, что это возможно с собственностью IsItemsHost, но, похоже, не работает. Это единственный способ? –

+0

Обновленный ответ со стилем для ItemsControl – Arcturus

+0

Ах, конечно, я могу просто добавить в этот стиль, спасибо. Если у вас есть время, вы можете посмотреть на 2 других вопроса, которые у меня есть, которые до сих пор не решены. http://stackoverflow.com/questions/3118266/wpf-datatemplate-property-set-at-content http://stackoverflow.com/questions/3004967/how-to-reuse-layouts-in-wpf –

3

Не забывайте определение свойства clue IsItemsHost = «True». В противном случае ваш элемент ItemsControl не будет показывать ваши элементы.

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

 Смежные вопросы

  • Нет связанных вопросов^_^