Aligning WrapPanel with same Spacing Size - c#

I'm trying to align my WrapPanel to have the same spacing size, although I can't figure out how. Here's an example of what I want,
XAML Code:
<ListBox Grid.Row="1" ItemsSource="{Binding HolidayGenerator}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<toolkit:WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected, Mode=TwoWay}" HorizontalAlignment="Right" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Any help is greatly apperciated.

I can't be sure that this will work, but I'm thinking that you may be able to coerce the vertical alignment of each column by setting the ItemWidth property on the WrapPanel (using a value that is appropriate based on the column width that you want it to render with):
<ItemsPanelTemplate>
<toolkit:WrapPanel Orientation="Horizontal" ItemWidth="25" />
</ItemsPanelTemplate>

Related

WPF Horizontal Listbox fill vertically

I'm making a list of products that display within a listbox that scrolls horizontally. I have the list scrolling horizontally however I only ever get 1 row of items even though the list box is high enough to populate 2 rows before it starts scrolling horizontally.
Part of my WPF code.
<DataTemplate x:Key="productTemplate">
<WrapPanel Orientation="Horizontal" Width="10" Height="10">
<Image Source="{Binding Photo}" Stretch="Fill" HorizontalAlignment="Center" VerticalAlignment="Center" Width="288" Height="320"/>
<Label Content="{Binding Name}" />
<Label Content="{Binding Cost}" />
</WrapPanel>
</DataTemplate>
<ListBox Width="1334" ItemsSource="{Binding Products}" SelectedItem="{Binding SelectedProduct}" ItemTemplate="{DynamicResource productTemplate}" Height="865" ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Disabled" BorderThickness="0">
<ListBox.Background>
<SolidColorBrush Color="White" Opacity="0.85"/>
</ListBox.Background>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel IsItemsHost="True" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
I'm looking for:
Any help would be great.
The WrapPanel that is used as ItemsPanel must have vertical orientation, and the ListBox must not scroll vertically:
<ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled" ...>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
...
</ListBox>
Maybe the following code will help you. The following code will help you to bind images in the following manner.
<ListBox Grid.Column="1" ItemsSource="{Binding Items}" Name="detailList" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"></WrapPanel>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" Width="90">
<Image Width="80" Source="{Binding Type,
Converter={x:Static local:HeaderToImageConverter.Instance}}"/>
<TextBlock FontSize="11" Text="{Binding Name}" VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

Horizontal Custom ListBox

I want my custom build ListBox to display the items on the next line if their size exceeds the available width of their parent control.
Following is my XAML for this purpose.
<materialDesign:Card>
<StackPanel>
<TextBlock FontWeight="DemiBold" FontSize="30">Schedule</TextBlock>
<ListBox ItemsSource="{Binding Schedule, Source={StaticResource dc}}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<ListBoxItem>
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<TextBlock>Day:</TextBlock>
<TextBlock Text="{Binding Key, Mode=OneWay}" />
</StackPanel>
<materialDesign:TimePicker materialDesign:HintAssist.Hint="Time In" SelectedTime="{Binding Value.TimeIn}" />
<materialDesign:TimePicker materialDesign:HintAssist.Hint="Time Out" SelectedTime="{Binding Value.TimeOut}" />
</StackPanel>
</ListBoxItem>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</materialDesign:Card>
Following is the Output for the above XAML
You should use a WrapPanel instead of a StackPanel, then.
As H.B. said, the ItemPanel control you should use is a WrapPanel that let you achieve what you want (when there isn't enough space for your control, it creates a new line).
Here it is an example:
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>

Scale Images to fit all into a horizontal aligned Listbox

I have a horizontal Listbox bound to an enum including a EnumToImageSource Converter working and need the Listbox/view to get a selectedItem.
I need the images in the Listbox to scale down their width to be all visible side by side without a horizontal scrollbar appearing even when resizing the window.
The Solutions in this question only work for normal vertical Listviews. Can this even be done what i'm trying to archive?
<ListBox HorizontalContentAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
ItemsSource="{Binding Source={StaticResource shoeValuesProvider}}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="{Binding Converter={StaticResource ShoeToImageConverter}}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Thanks to Sinatr's comment i found out the solution which indeed uses a UniformGrid with one Row defined and setting the width to the ancestor ScrollContentPresenter as noted here:
<StackPanel x:Name="ReferenceStackPanel">
<ListBox HorizontalContentAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
SelectedItem="{Binding ShoeModel}"
ItemsSource="{Binding Source={StaticResource shoeValuesProvider}}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Margin="0" Rows="1" Width="{Binding ActualWidth,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}"></UniformGrid>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="{Binding Converter={StaticResource ShoeToImageConverter}}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>

Orientation of StackPanel is not Working in ItemsControl (WPF)

My WPF Application is generating dynamic Buttons. I want to show these Button Horizontally. I wrote Code for this. Code is working fine but rather than showing button in Horizontal Direction, it is showing all Buttons in Vertical Direction! Where i also set Orientation of StackPanel!
Can anyone solve my Problem?
My Code is:
<Grid>
<dxlc:ScrollBox>
<ItemsControl x:Name="Buttonslist">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button Content="{Binding Text}" Tag="{Binding Text}" x:Name="New" Margin="5,0,5,0" Click="New_Click" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</dxlc:ScrollBox>
</Grid>
You're actually creating a StackPanel for each item/Button. To get just one for all the items you need to set the ItemsPanel of the control to a StackPanel.
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Text}" Tag="{Binding Text}" x:Name="New" Margin="5,0,5,0" Click="New_Click" />
</DataTemplate>
</ItemsControl.ItemTemplate>

adding dynamic buttons wpf in a wrappanel

I am trying to display buttons dynamically on the screen in a wrap panel so that they are laid our nicely without any scrollbars. I have the markup as below, but the scrollbars appear for some reason. how do we make the scrollbar not appear and the buttons laid out without any scrollbars.
<ListBox x:Name="ItemsListBox" >
<ListBox.ItemTemplate>
<DataTemplate>
<ToggleButton Content="{Binding Name}" Click="Click" MinWidth="120" MinHeight="70" FontWeight="Bold" FontSize="18"/>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel></WrapPanel>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
What control is your ListBox inside? Most often the problem you descrive is caused by the parent control allowing the ListBox to grow.
You can prove whether this is the problem by setting an explicit Width="200" on your ListBox and testing what happens. If it wraps, then the problem is the ListBox's parent.
Add
ScrollViewer.VerticalScrollBarVisibility="Hidden"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
to you containers.
This does it what I was trying to achieve.
<ItemsControl x:Name="ListBox" Grid.Row="5" Grid.ColumnSpan="2">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Vertical"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ToggleButton Content="{Binding Name}" MinWidth="120" MinHeight="50" FontWeight="Bold" FontSize="16" Margin="5"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

Categories