WPF:多列列表框/列表视图?

18

我想在WPF中创建一个列表,以几列的形式显示数据,就像资源管理器在“小图标”视图模式下显示文件列表一样:

多列列表框

每个项都必须由DataTemplate表示,并且滚动应水平进行。我该如何创建这样的列表?


你已经检查了ItemsControl和ItemsControl.ItemsPanelTemplate以进行水平滚动吗? - blindmeis
是的,我尝试过那样做,但找不到让项目在多个垂直列中堆叠的方法。 - Impworks
统一网格(UniformGrid)或 - blindmeis
3个回答

27

您需要将ListBoxItemsPanel更改为垂直OrientationWrapPanel,并在ListBox上禁用垂直滚动条。

<ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled" ItemsSource="{Binding=MyItems}">
  <ListBox.ItemTemplate>
      <DataTemplate>
          <!--my item template-->
      </DataTemplate>
  </ListBox.ItemTemplate>
  <ListBox.ItemsPanel>
      <ItemsPanelTemplate>
          <WrapPanel Orientation="Vertical"/>
      </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
</ListBox>

很棒的实现-@JSJ的也不错,但这个没有网格标题也很好。 - jharr100

10

尝试像下面这样做。

<ListBox>
 <ListBox.ItemsPanel>
  <ItemsPanelTemplate>
   <UniformGrid Columns="3"/>
  </ItemsPanelTemplate>
 </ListBox.ItemsPanel>

 <DataTemplate>
      <!--my item template-->
 </DataTemplate>
</ListBox>

可以使用这个链接。


6
尝试以下类似的方法:
<ListView ItemsSource="{Binding Files}" >
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel 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.ItemsPanel>
            <ListView.View>
                <GridView >
                    <GridView.Columns>
                        <GridViewColumn DisplayMemberBinding="{Binding Name}" />
                    </GridView.Columns>
                </GridView>
            </ListView.View>
        </ListView>

后端代码示例。

 public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            Files = new ObservableCollection<FileInfo>();
            var files = new System.IO.DirectoryInfo("C:\\Windows\\").GetFiles();
            foreach (var item in files)
            {
                Files.Add(item);
            }
            this.DataContext = this;
        }

        public ObservableCollection<FileInfo> Files { get; set; }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接