2011-01-18 16 views
12

Tengo un ListBox (WPF) que contiene CheckBoxes. Estoy usando está en una pantalla de configuración. Ejemplo esquemático a continuación:WPF Diseño de cuadro de lista: múltiples columnas

alt text

Ahora quiero añadir una casilla de verificación "Prueba 5". Me he limitado espacio vertical, así que quiero que aparezca en la dirección horizontal, como se muestra a continuación:

alt text

¿Puede el diseño ListBox ser modificado por lo que las casillas de verificación serán dispuestos de esta manera?

+0

Tal vez un Listbox puede hacer eso, pero ¿por qué no un WrapPanel? ¿Realmente necesitas un SelectedItem? –

+0

@Henk, establecer un 'WrapPanel' como' ItemsPanel' de ListBox' hará. – decyclone

+0

@decyc, lo sé, pero todavía cuestiono la necesidad/deseo de un LB en primer lugar. –

Respuesta

17
<ListBox Name="CategoryListBox" 
     ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
     ItemsSource="{Binding Path=RefValues, 
       UpdateSourceTrigger=PropertyChanged}" 
       SelectionMode="Multiple"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <ListBox.ItemTemplate> 
     <DataTemplate > 
      <StackPanel Orientation="Horizontal" 
         MinWidth="150" MaxWidth="150" 
         Margin="0,5, 0, 5" > 
       <CheckBox 
        Name="checkedListBoxItem" 
        IsChecked="{Binding 
          RelativeSource={RelativeSource FindAncestor, 
          AncestorType={x:Type ListBoxItem} }, 
          Path=IsSelected, Mode=TwoWay}" /> 
       <ContentPresenter 
        Content="{Binding 
          RelativeSource={RelativeSource TemplatedParent}, 
          Path=Content}" 
        Margin="5,0, 0, 0" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

o tan simple como esto:

<Grid> 
    <ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel IsItemsHost="True" /> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBoxItem>listbox item 1</ListBoxItem> 
     <ListBoxItem>listbox item 2</ListBoxItem> 
     <ListBoxItem>listbox item 3</ListBoxItem> 
     <ListBoxItem>listbox item 4</ListBoxItem> 
     <ListBoxItem>listbox item 5</ListBoxItem> 
    </ListBox> 
</Grid> 
9

me encontré con un problema similar y la respuesta de eibhrum me dio una idea. Usé el siguiente código y creo que esto también es lo que necesitas. Usé UniformGrid en lugar de WrapPanel.

<ListBox HorizontalAlignment="Stretch" 
     ItemsSource="{Binding Timers}" 
     > 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter> 
     </Style> 
    </ListBox.ItemContainerStyle> 

     <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <!-- UNIFORM GRID HERE --> 
      <UniformGrid Columns="3" IsItemsHost="True" 
       HorizontalAlignment="Stretch"/> 
     </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 

     <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Border> 
       <StackPanel Orientation="Vertical" > 
        <TextBlock Text="{Binding Label}" TextWrapping="Wrap"/> 
        <Separator Margin="5,0,10,0"/> 
       </StackPanel> 
      </Border> 
     </DataTemplate> 
     </ListBox.ItemTemplate> 

    </ListBox> 
1

Sé que esto es un mensaje más antiguo, pero me encontré con una forma bastante simple de hacer esto mientras yo estaba tratando de resolver el mismo problema aquí: http://social.technet.microsoft.com/wiki/contents/articles/19395.multiple-columns-in-wpf-listbox.aspx

acaba de añadir su fuente de enlace de datos (o agregar elementos según sea necesario).

<ListBox Name="myLB" ScrollViewer.HorizontalScrollBarVisiblity="Disabled"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Columns="2" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 
+0

Me gusta que hayas incluido un enlace, pero trato de entender cómo tu respuesta es diferente a la que deja @gisek. Si hay una diferencia significativa (reconozco que me puede estar perdiendo), puede señalar qué es eso. – David

Cuestiones relacionadas