wpf 如何使列表视图可滚动,可调整大小?

2admgd59  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(190)

最初我想让listview依赖于窗口高度参数,但老实说,我觉得这个解决方案不切实际,相信它可以做得更好。
这是我感兴趣的一个对象:

<StackPanel>
            <TextBlock Text="{Binding LessonTitle}" Foreground="Black" HorizontalAlignment="Center" Margin="0,10,0,0" FontSize="36" Background="DimGray"></TextBlock>
            <Grid Height="Auto" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Hidden">
                <ListView x:Name="LV2" Background="DimGray"
                          BorderBrush="Transparent"
                          ItemsSource="{Binding Lessons}"
                       ScrollViewer.VerticalScrollBarVisibility="Hidden" 
                      ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                      SizeChanged="LV2_SizeChanged">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Height="1000"
                                        ScrollViewer.CanContentScroll="True" 
                                        ScrollViewer.VerticalScrollBarVisibility="Hidden">
                                    <TextBlock Width="Auto" FontSize="24" Foreground="Black" TextWrapping="Wrap">
                                        <Run Text="{Binding LessonText}"/>
                                    </TextBlock>
                                    <Image Source="{Binding LessonImage}"/>
                                </StackPanel>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
            </Grid>
        </StackPanel>

我的列表视图和几次尝试的残余,使它可滚动(也可调整大小的窗口),滚动我的意思是使整个列表滚动顺利,而不是每个元素,但我不知道如何实现它。
我已经尝试过将stackpanel改为dockpanel/grids,反之亦然,不同的scrollviwer位置,但都不起作用。到目前为止,我最多只能滚动列表视图的第一个项目,或者一个项目一个项目滚动。

cnwbcb6i

cnwbcb6i1#

<StackPanel>
            <TextBlock Text="{Binding LessonTitle}" Foreground="Black" HorizontalAlignment="Center" Margin="0,10,0,0" FontSize="36" Background="DimGray"></TextBlock>
            <Grid Height="Auto" >
                <ListBox x:Name="LV2" Width="400" Height="400" Background="DimGray"
                          BorderBrush="Transparent"
                          ItemsSource="{Binding Lessons}"
                      SizeChanged="LV2_SizeChanged">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Height="1000">
                                    <TextBlock FontSize="24" Foreground="Black" TextWrapping="Wrap">
                                        <Run Text="{Binding LessonText}"/>
                                    </TextBlock>
                                    <Image Source="{Binding LessonImage}"/>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
            </Grid>
        </StackPanel>

默认情况下,ListBox具有这些属性。只需定义可见区域的大小,超出该区域的所有内容都可以滚动。您可能希望将项目分隔到它们自己的项目插槽中,而不是扩展到远远超出其内容尺寸的堆栈面板。下面是一个例子:

<StackPanel>
    <TextBlock Text="{Binding LessonTitle}" Foreground="Black" HorizontalAlignment="Center" Margin="0,10,0,0" FontSize="36" Background="DimGray"></TextBlock>
    <Grid Height="504" >
        <ListBox x:Name="LV2" Height="400" Background="DimGray" BorderBrush="Transparent" ItemsSource="{Binding Lessons}" Panel.ZIndex="1" VerticalContentAlignment="Stretch" ScrollViewer.CanContentScroll="True">
                <TextBlock FontSize="24" Foreground="Black" TextWrapping="Wrap" Text="{Binding LessonText}" />
                <Image Source="/Image2.png" Width="297" Height="498"/>
        </ListBox>
    </Grid>
</StackPanel>

如果需要用大量的项填充列表,最简单的方法是在。cs / vb代码隐藏。C#应该是这样的:

var lessons = //the source of the items.
foreach(var item in lessons){ LV2.Items.Add((new Grid/Canvas/Panel{ Child/Children.Add/Content = item }));

如果需要多种类型的父控件,请添加一个if else循环来检查类型,并添加一个foreach循环来处理相应的类型

相关问题