Usercontrols складываются по вертикали, а не по горизонтали

Мой пользовательский элемент управления загружается X раз и должен загружаться вместе, пока не останется места. Я пробовал использовать панель обтекания, но это не имеет значения, и ни одна из них не имеет панели с горизонтальным стеком. Я явно делаю здесь что-то не так и хотел бы получить совет:

Страница XAML:

<Grid Background="#FFFFFF">        
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Label Grid.Row="0" x:Name="lblCellPageTitle" Content="Cellect" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" HorizontalAlignment="Center" Height="43"  VerticalAlignment="Top" Width="221" FontSize="22"/>
    <StackPanel Grid.Row="1" Orientation="Horizontal">
        <ItemsControl Grid.Row="1" Name="CellControlContainer"/>
    </StackPanel>
</Grid>

Кнопка UserControl:

<UserControl x:Class="WpfApp1.UserControls.CellButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfApp1"
             mc:Ignorable="d" 
             d:DesignHeight="100" d:DesignWidth="180">

        <Button Name="Cellx" Content="CellX" Width="100" Height="100" FontSize="19" Padding="5" Click="Cellx_Click"  />

</UserControl>

Page.cs (вызывает usercontrol):

 public partial class CellNumber : Page
    {

        public CellNumber()
        {
            InitializeComponent();

            for (int i = 0; i <= Global.noCells; i++)
            {
                CellControlContainer.Items.Add(new UserControls.CellButton(i));
            }
        }
  • Текущий результат - кнопки располагаются вертикально
  • Желаемый результат - Кнопки завернуты по горизонтали
0
0
31
1

Ответы 1

Используйте горизонтальную WrapPanel или StackPanel в качестве ItemsPanel ItemsControl:

<ItemsControl Name="CellControlContainer">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

Кроме того, вместо добавления элементов в код лучше назначить или привязать свойство ItemsSource к (необязательно наблюдаемой) коллекции элементов данных и создать их визуальное представление с помощью DataTemplate, который используется в качестве ItemTemplate ItemsControl, как в этом простом примере:

<ItemsControl ItemsSource="{Binding CellRange}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <usercontrol:CellButton Number="{Binding}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Другие вопросы по теме