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