Как добавить больше столбцов в список - PullRequest
0 голосов
/ 05 мая 2020

Итак, я пытаюсь заполнить ListView созданным мною UserControl.

Но когда я заполняю ListView, он показывает по одному столбцу на ячейку, как я могу это исправить?

Одно изображение, чтобы описать его более внимательно

Это код, который я использую, io пробовал использовать AllowsColumnReorder, но он не меняет его порядок с помощью самого списка. Как это сделать?

XML

<ListView Name="myListView" Style="{StaticResource MahApps.Styles.ListView}">
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Vertical" Width="{Binding (FrameworkElement.ActualWidth), 
            RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}"
            ItemWidth="{Binding (ListView.View).ItemWidth, 
            RelativeSource={RelativeSource AncestorType=ListView}}"
            MinWidth="{Binding ItemWidth, RelativeSource={RelativeSource Self}}"
            ItemHeight="{Binding (ListView.View).ItemHeight, 
            RelativeSource={RelativeSource AncestorType=ListView}}" />
        </ItemsPanelTemplate>
        <ListView.View>
            <GridView AllowsColumnReorder="True">
                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <local:GalleryButton Height="100" Width="150"></local:GalleryButton>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

Code-Behind

private void Grid_Loaded(object sender, RoutedEventArgs e)
{
        List<GalleryButton> butons = new List<GalleryButton>();

        for (int i = 0; i < 30; i++)
        {
            GalleryButton b = new GalleryButton();
            butons.Add(b);
        }

        myListView.Items.Clear();
        myListView.ItemsSource = null;
        myListView.ItemsSource = butons;
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Наконец-то я не понял, как это сделать, спасибо @ Keithe rnet Я понял, как это исправить, это код

XAML

<Grid>
    <ItemsControl x:Name="myListView" Margin="0,0,0,0" >
        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="FrameworkElement.Margin" Value="5"/>
            </Style>
        </ItemsControl.ItemContainerStyle>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid DataContext="{Binding RelativeSource={RelativeSource Self}}" Rows="{Binding Path=Rows, Mode=TwoWay}" Columns="{Binding Path=Columns, Mode=TwoWay}"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <local:GalleryButton></local:GalleryButton>

            </DataTemplate>
        </ItemsControl.ItemTemplate>

        <ItemsControl.Template>
            <ControlTemplate >
                <Border x:Name="Border"
                        SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <ScrollViewer Margin="0"
                                  Focusable="False"
                                  Padding="{TemplateBinding Padding}"
                                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                  HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
                                  VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}"
                                  CanContentScroll="{TemplateBinding ScrollViewer.CanContentScroll}">
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                    </ScrollViewer>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="Border" Property="Background" Value="Blue" />
                        <Setter TargetName="Border" Property="BorderBrush" Value="Silver" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </ItemsControl.Template>
    </ItemsControl>
</Grid>

Code-Behind

public partial class ModelGallery : UserControl
{
    public int Rows { get; set; }
    public int Columns { get; set; }

    public ModelGallery()
    {
        InitializeComponent();
        DataContext = this;
        myListView.Items.Clear();
    }

    public void setModelList(List<GalleryButton> llista)
    {
        Columns = 5;
        Rows = llista.Count / Columns;
        myListView.ItemsSource = llista;
    }
}

Итак, мне понадобился ControlTemplate, чтобы все было правильно с ScrollViwer, все остальное было очень интуитивно понятным, так что мы необходимость? Шаблон для просмотра элементов и их последующего отображения. тогда нам нужно только отрендерить Scroll. Спасибо за вашу помощь.

0 голосов
/ 05 мая 2020

Основная проблема заключается в том, что вы пытаетесь использовать вертикальный WrapPanel в элементе управления с вертикальной прокруткой. Таким образом вы всегда будете видеть только один столбец.

И поскольку вы показываете список кнопок, вам, вероятно, не нужно использовать ListView.

Вы можете рассмотреть возможность использования простой ItemsControl вместо этого. XAML очень похож, и вы можете более легко контролировать прокрутку, потому что вы предоставляете ScrollViewer.

Если у вас нет жесткого требования, чтобы ваши элементы переносились по вертикали, я настоятельно рекомендую (с точки зрения UX) обертывание ваши предметы по горизонтали. Это больше соответствует тому, что делает большинство приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...