C# 如何阻止ListView扩展到内容

C# 如何阻止ListView扩展到内容,c#,wpf,xaml,C#,Wpf,Xaml,我试图使我的xaml压缩列表项(图像)适合初始窗口大小,但它们不能固定大小,因为我想随着窗口大小的增加而放大它们。像ViewBox这样的东西就可以了 我从2个文件夹(软件和硬件)加载图像。图像的数量和大小在运行时会很谨慎,所以我希望使项目大小相同,而不管图像大小或项目数量如何。 这就是为什么我使用统一网格作为项目面板模板的原因 但是,这是我得到的结果 ListView加载图像的全尺寸,并将其自身展开以适合它们,在过程中剪切一些项目 这是我的xaml: <Window x:Class=&q

我试图使我的xaml压缩列表项(图像)适合初始窗口大小,但它们不能固定大小,因为我想随着窗口大小的增加而放大它们。像ViewBox这样的东西就可以了

我从2个文件夹(软件和硬件)加载图像。图像的数量和大小在运行时会很谨慎,所以我希望使项目大小相同,而不管图像大小或项目数量如何。 这就是为什么我使用统一网格作为项目面板模板的原因

但是,这是我得到的结果

ListView加载图像的全尺寸,并将其自身展开以适合它们,在过程中剪切一些项目

这是我的xaml:

<Window x:Class="WPF_UI_Testing.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_UI_Testing"
        mc:Ignorable="d"
        Title="MainWindow" Height="460" Width="640">


    <Grid>
        <ListView x:Name="listview1">

            <ListView.GroupStyle>
                <GroupStyle>
                    <GroupStyle.HeaderTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding Name}"
                                           FontWeight="Bold" FontSize="18" />
                            </StackPanel>
                        </DataTemplate>
                    </GroupStyle.HeaderTemplate>
                    <GroupStyle.Panel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Vertical"></StackPanel>
                        </ItemsPanelTemplate>
                    </GroupStyle.Panel>
                </GroupStyle>
            </ListView.GroupStyle>

            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid ></UniformGrid>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>

            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <Image Source="{Binding problemImage}"/>
                        <TextBlock Text="{Binding ImageName}"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>

        </ListView>
    </Grid> 
</Window>

有没有办法防止ListView在填充内容时扩展到窗口边界之外

编辑:

我用一些虚拟数据和图像打包了整个解决方案,如果有人想尝试一下的话。。。
UniformGrid基本上满足了您的需求。将其用作项目面板的想法也是正确的。除了使用项目组之外,出现的唯一问题是
列表视图
将其面板包装到
ScrollViewer
中,这导致项目或
UniformGrid
的大小不同,因为
ScrollViewer
不限制面板的大小
UniformGrid
需要托管在固定大小的容器中,以便能够计算其子容器的最大大小

您应该使用
ItemsControl

<ItemsControl>
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <UniformGrid />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>

  <ItemsControl.ItemTemplate>
    <DataTemplate DataType="{x:Type viewModels:DetailItem}">
      <StackPanel>
        <Image Source="{Binding problemImage}"/>
        <TextBlock Text="{Binding ImageName}"/>
      </StackPanel>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>
这种方法的局限性在于使用组显示项目时
UniformGrid
应按预期处理
GroupItem
(嵌套项)

正如我在上一次评论中所说,如果要对项目进行分组,需要扩展一个您选择的面板,以手动排列
GroupItem
及其子项(嵌套
ItemsPresenter
)。在考虑如何计算尺寸时,您可能会意识到,使用动态分组项目尺寸计算分组项目尺寸更为复杂


我建议放弃分组并使用上述解决方案之一,或者使用分组并使用
ScrollViewer

您是否尝试为
图像
控制器指定宽度和高度?是的,但我不想这样做,因为我不希望其大小固定。如果我调整窗口的大小,我希望能够将其放大。如果可能的话,我们也希望避免修改最小和最大宽度和高度。图像有特定的纵横比,但窗口大小可以是任意大小。因此,您必须从窗口获取宽度或高度。如果为“宽度”,则将“容器宽度”设置为“窗口宽度”。然后均匀缩放图像。我想我明白你的意思了,但是由于我的容器在listView中,我不知道如何定位它。默认情况下,
listView
本身将拉伸以适合其父控件(当控件的子控件控制其子控件的大小时,例如
网格
)。此外,当内容包含的项目超出实际容纳范围时,内容将超出
列表视图
维度(视图端口)。禁用ScrollViewer将使这些项目无法访问。要使项目具有固定的大小,请将
样式设置为
ListView.ItemContainerStyle
,并根据需要设置
宽度和
高度。UniformGrid或面板通常对父级(
ListViewItem
)的大小没有直接影响。它唯一关心的是布局它的子元素。我选择放弃组,至少现在是这样。我接受了答案,尽管这并没有完全解决我的问题。至少我可以继续这个项目:)
<ListView>
  <ListView.Template>
    <ControlTemplate TargetType="ListView">
      <Border BorderBrush="{TemplateBinding BorderBrush}"
              BorderThickness="{TemplateBinding BorderThickness}"
              Background="{TemplateBinding Background}">
        <ItemsPresenter />
      </Border>
    </ControlTemplate>
  </ListView.Template>

  <ListView.ItemsPanel>
    <ItemsPanelTemplate>
      <UniformGrid />
    </ItemsPanelTemplate>
  </ListView.ItemsPanel>

  <ListView.ItemTemplate>
    <DataTemplate DataType="{x:Type viewModels:DetailItem}">
      <StackPanel>
        <Image Source="{Binding problemImage}"/>
        <TextBlock Text="{Binding ImageName}"/>
      </StackPanel>
    </DataTemplate>
  </ListView.ItemTemplate>
</ListView>