用于模拟Outlook附件视图的WPF控件

用于模拟Outlook附件视图的WPF控件,wpf,xaml,Wpf,Xaml,我正在尝试使ListView看起来像MS Outlook附件控件。我已经得到了水平滚动,但它仍然只显示一行中的一项 我怎样才能让它看起来像这样? 到目前为止我所取得的成就: <Grid x:Name="grdAttachments" Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="3"> <Grid.RowDefinitions> <RowDefinition

我正在尝试使ListView看起来像MS Outlook附件控件。我已经得到了水平滚动,但它仍然只显示一行中的一项

我怎样才能让它看起来像这样?

到目前为止我所取得的成就:

<Grid x:Name="grdAttachments"
      Grid.Row="4"
      Grid.Column="1"
      Grid.ColumnSpan="3">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" MaxHeight="45" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="65" />
        <ColumnDefinition Width="15" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Column="0"
               Margin="3,0,0,0"
               HorizontalAlignment="Left"
               VerticalAlignment="Center"
               Cursor="Hand"
               Text="Angefügt:" />

    <ScrollViewer Grid.Row="0" Grid.Column="2">
        <ListBox x:Name="libAttachments"
                 Background="Transparent"
                 ItemsSource="{Binding Attachments}"
                 MouseDoubleClick="lvAttachments_MouseDoubleClick">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,0,10,0" Orientation="Horizontal">
                        <Image Source="{Binding MimeTypeIcon}" Stretch="None" />
                        <TextBlock Margin="5,0,0,0" Text="{Binding File.Name}" />
                        <StackPanel.ContextMenu>
                            <ContextMenu>
                                <ContextMenu.Items>
                                    <MenuItem Click="btnOpenAttachment_Click" Header="Öffnen">
                                        <MenuItem.Icon>
                                            <Image Source="/Images/magnifier.png" Stretch="None" />
                                        </MenuItem.Icon>
                                    </MenuItem>
                                    <MenuItem Click="btnSaveAttachment_Click" Header="Speichern unter">
                                        <MenuItem.Icon>
                                            <Image Source="/Images/disk-black.png" Stretch="None" />
                                        </MenuItem.Icon>
                                    </MenuItem>
                                </ContextMenu.Items>
                            </ContextMenu>
                        </StackPanel.ContextMenu>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </ScrollViewer>
</Grid>

听起来您想要的是一个带有自定义ItemsPanel的

    <ListBox>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ListBox>

上面的代码段将列表框配置为使用作为布局提供程序或“ItemsPanel”来显示要显示的项。从这里可以实现自定义项容器样式和/或自定义数据模板。如果使用MVVM模式并将数据绑定到集合(最好是可观察的),则可以像上面那样轻松地应用DataTemplate


要完成此图片,可以使用滚动查看器,只要其高度受父布局控件(Grid.Row=1,其中RowDefinition height=“constant”)或滚动查看器上设置的显式高度的约束

我基于您的最终解决方案如下所示:

     <ScrollViewer HorizontalScrollBarVisibility="Disabled">
        <ListBox
        ItemsSource="{Binding Attachments}"
        MouseDoubleClick="lvAttachments_MouseDoubleClick"
        SelectionMode="Single">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,0,10,0" Orientation="Horizontal">
                        <Image Source="{Binding MimeTypeIcon}" Stretch="None" />
                        <TextBlock Margin="5,0,0,0" Text="{Binding File.Name}" />
                        <StackPanel.ContextMenu>
                            <ContextMenu>
                                <ContextMenu.Items>
                                    <MenuItem Click="btnOpenAttachment_Click" Header="Öffnen">
                                        <MenuItem.Icon>
                                            <Image Source="/Images/magnifier.png" Stretch="None" />
                                        </MenuItem.Icon>
                                    </MenuItem>
                                    <MenuItem Click="btnSaveAttachment_Click" Header="Speichern unter">
                                        <MenuItem.Icon>
                                            <Image Source="/Images/disk-black.png" Stretch="None" />
                                        </MenuItem.Icon>
                                    </MenuItem>
                                </ContextMenu.Items>
                            </ContextMenu>
                        </StackPanel.ContextMenu>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </ScrollViewer>


<>请注意:如果可能的话,考虑使用替代事件,它们会导致松散耦合。如果行为本身是项目中其他地方的东西,或者可重用性是理想的,那么引入a甚至可能是有意义的。

听起来你想要的是一个带有自定义ItemsPanel的a

    <ListBox>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ListBox>

上面的代码段将列表框配置为使用作为布局提供程序或“ItemsPanel”来显示要显示的项。从这里可以实现自定义项容器样式和/或自定义数据模板。如果使用MVVM模式并将数据绑定到集合(最好是可观察的),则可以像上面那样轻松地应用DataTemplate


要完成此图片,可以使用滚动查看器,只要其高度受父布局控件(Grid.Row=1,其中RowDefinition height=“constant”)或滚动查看器上设置的显式高度的约束

我基于您的最终解决方案如下所示:

     <ScrollViewer HorizontalScrollBarVisibility="Disabled">
        <ListBox
        ItemsSource="{Binding Attachments}"
        MouseDoubleClick="lvAttachments_MouseDoubleClick"
        SelectionMode="Single">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,0,10,0" Orientation="Horizontal">
                        <Image Source="{Binding MimeTypeIcon}" Stretch="None" />
                        <TextBlock Margin="5,0,0,0" Text="{Binding File.Name}" />
                        <StackPanel.ContextMenu>
                            <ContextMenu>
                                <ContextMenu.Items>
                                    <MenuItem Click="btnOpenAttachment_Click" Header="Öffnen">
                                        <MenuItem.Icon>
                                            <Image Source="/Images/magnifier.png" Stretch="None" />
                                        </MenuItem.Icon>
                                    </MenuItem>
                                    <MenuItem Click="btnSaveAttachment_Click" Header="Speichern unter">
                                        <MenuItem.Icon>
                                            <Image Source="/Images/disk-black.png" Stretch="None" />
                                        </MenuItem.Icon>
                                    </MenuItem>
                                </ContextMenu.Items>
                            </ContextMenu>
                        </StackPanel.ContextMenu>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </ScrollViewer>


<>请注意:如果可能的话,考虑使用替代事件,它们会导致松散耦合。如果行为本身是项目中其他地方或可重用性理想的东西,那么引入a甚至可能是有意义的。

好吧,那么你似乎陷入困境的地方是,你的列表框仍然以单列方式推送内容,并且没有能力给你一些东西,比如点击事件。所以我的想法更像这样

<ScrollViewer HorizontalScrollBarVisibility="Disabled" Height="300" HorizontalContentAlignment="Stretch">

   <ItemsControl ItemsSource="{Binding Collection}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
           <StackPanel Margin="5,0" Orientation="Horizontal">
                       <Image Source="{Binding MimeTypeIcon}" Stretch="None" />
                       <HyperlinkButton Margin="5,0,0,0" Text="{Binding File.Name}" />
                   </StackPanel>          
        </DataTemplate>
    </ItemsControl.ItemTemplate>
   </ItemsControl>
</ScrollViewer>

我不确定你想用你的放大镜和磁盘做什么,虽然我看到你点击了它们,但是你可以把它们添加到这个布局中,不管你喜欢什么,只是一个注释,我只是在会议之间自由使用它,所以从来没有建过它,但应该可以很好地工作。如果不行,我们就再插一次。主要的区别是变为h