XAML 为每行动态设置ListView / WrapPanel项高度

lyr7nygr  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(144)

我有一个Listview,我想在WrapPanel中显示一个对象列表,每个对象都包含另一个嵌套ListView的字符串列表,因为每个对象的列表有不同的条目数,因此具有可变的高度。
现在,我希望第一个ListView的每个ListViewItem的高度与WrapPanel中每行的最大高度相同,以便ListViewItem的内容在可用空间上展开。
下面是XAML:

<Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <ListView ItemsSource="{Binding List1}" Grid.Column="0" ScrollViewer.HorizontalScrollBarVisibility="Disabled">

            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Horizontal" ></WrapPanel>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>

            <ListView.ItemContainerStyle >
                <Style TargetType="ListViewItem" >
                    <Setter Property="VerticalAlignment" Value="Top" />
                </Style>
            </ListView.ItemContainerStyle>
            
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Expander IsExpanded="True" Width="230" >
                        <Expander.Header>
                            <TextBlock Text="{Binding Title}" FontSize="16" />
                        </Expander.Header>
                        <Border BorderBrush="LightGray" BorderThickness="0.5" >
                            <ListView ItemsSource="{Binding Persons}" >
                                <ListView.ItemTemplate>
                                    <DataTemplate>
                                        <TextBlock Text="{Binding}" Grid.Column="1" Margin="10,0" />
                                    </DataTemplate>
                                </ListView.ItemTemplate>
                            </ListView>
                        </Border>
                    </Expander>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>

一些DataContext:

public List<object1> List1 { get; set; }
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        List1 = new List<object1>
            {
                new object1("Global Summit", new List<string> { "John Smith", "Maria Garcia", "Hiroshi Tanaka", "Sophie Dubois" }),
                new object1("International Conference", new List<string> { "Elena Petrova", "Rajesh Patel" }),
                new object1("Production", new List<string> { "Luis Hernandez", "Sofia Kim", "Mohammed Ali", "Ol Kapoor", "Anika Schmidt" }),
                new object1("Awareness Training", new List<string> { "Max Mauser"})
            };
        }
    }

    public class object1
    {
        public object1(string title, List<string> persons)
        {
            Title = title;
            Persons = persons;
        }
        public string Title { get; set; }
        public List<string> Persons { get; set; }
    }

这就是我得到的:

正如你所看到的,每个ListViewItems的Height是由它的内容定义的,但我希望它能拉伸以适应WrapPanel每一行的可用空间,我不希望所有Items都有一个固定的Height,那看起来很糟糕。
这就是我想要的:

我试着改变VerticalAlignment="Stretch"VerticalContentAlignment="Stretch"的ItemTemplate的内容和ItemContainerStyle,我试着在不同的地方用不同的边距和对齐方式,但没有任何效果。看起来ListViewItem设置了它的高度来适应孩子们,我找不到一种方法来改变它。
对于上下文:在我的应用程序中,我希望用户能够拖放的人从一个对象到另一个。这已经工作了,但ist似乎只是浪费空间,它会感觉更自然的用户只是拖放一个人从一个对象稍微向右到下一个对象,而不是向右和向上拖动,并不得不把它放在较小的列表。

mznpcxlj

mznpcxlj1#

您可以插入一个填充ListViewItem空间的Panel或Border,使其承载ContentPresenter。

<ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
        <Setter Property="Background" Value="LightGray"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <Border Background="{TemplateBinding Background}">
                        <ContentPresenter/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ListView.ItemContainerStyle>

相关问题