首页 > 解决方案 > 在 UWP 的另一个响应式容器中,在 C# 中创建多个带有滚动条的 ListView

问题描述

我在 Xaml 中有一个容器(目前是 StackPanel,我知道这不是最好的,但对我来说唯一可以正常工作的东西)。在该容器内,我需要在 cs 文件中创建未定义数量的列表(最多 10 个)。问题是,当列表很长时,它们没有滚动条,除非我限制了 StackPanel 的高度,但这限制了应用程序的响应能力。使用 Grid 也有问题,因为我需要容器来处理每个新创建的 ListView 的放置。我也看到了相关的解决方案,但它们总是引用 Xaml 而不是 C# 中的视图列表。

我的 Xaml 代码:

<Grid VerticalAlignment="Stretch">
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <StackPanel Name ="sensorDataStackPanel" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Top">
        <ComboBox x:Name="sensorComboBox" PlaceholderText="Pick sensor" ItemsSource="{x:Bind Path=sensors_collection}" 
                      SelectionChanged="SensorComboBox_SelectionChanged"/>
        <StackPanel Name="AxiseslistViewStackPanel" Orientation="Horizontal" MaxHeight="300"/>

    </StackPanel>  
</Grid>

C# 代码 --> 当用户在 ComboBox 中选择传感器时,会在 StackPanel 中相应地创建列表:

public sealed partial class Layout_Tab : Page
{
    public ObservableCollection<Sensor> sensors_collection;
    public ObservableCollection<Axis> axises;

    .......
    private void SensorComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        ComboBox comboBox = sender as ComboBox;
        Sensor chosen_sensor = (Sensor)comboBox.SelectedItem;
        axises = chosen_sensor.axisesList;
        this.AxiseslistViewStackPanel.Children.Clear();

        foreach(var axis in axises)
        {
            ListView listView = new ListView { Header = axis.AxisName, SelectionMode = ListViewSelectionMode.Multiple,
            ShowsScrollingPlaceholders =true, CanBeScrollAnchor = true};
            foreach(var antenna in axis.inUseAntennaList)
            {
                listView.Items.Add(antenna);
            }
            this.AxiseslistViewStackPanel.Children.Add(listView);
        }
    }
}

这是一张定义了 StackPanel 高度的图片:

2 列出带有视图列表的示例

谢谢大家

编辑:更改为 GridView 后仍然得到相同的结果:

<GridView Name="AxiseslistViewStackPanel" ItemsSource="{x:Bind axises}">
    <GridView.ItemTemplate>
        <DataTemplate x:DataType="tests:Axis">
            <StackPanel>
                <TextBlock Text="{x:Bind AxisName}"/>
                <ListView ItemsSource="{x:Bind inUseAntennaList}" ScrollViewer.VerticalScrollMode="Enabled" ScrollViewer.IsVerticalRailEnabled="True" ScrollViewer.VerticalScrollBarVisibility="Visible"/>
             </StackPanel>
         </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

这就是没有高度限制的 GridView: 在此处输入图像描述

标签: c#listviewuwp

解决方案


之所以ListView可以滚动,是因为它们有一个ScrollViewer内部。当您将 aListView放在 parent 内部时StackPanel,如果ListView高度大于视口,则父面板将成为ListView. 您可以通过获取 StackPanel 和ActualHeightlistview 项目单击方法来验证这一点。这就是为什么列表视图在固定ListView高度时起作用的原因。

修复很简单:将父布局面板放在ScrollViewer.

<ScrollViewer>
    <StackPanel Name="RootLayout" >
        <Button
        VerticalAlignment="Top"
        Click="Button_Click"
        Content="AddListView"
        />
    </StackPanel>
</ScrollViewer>

推荐阅读