代码之家  ›  专栏  ›  技术社区  ›  Larry

项控件、虚拟化跟踪面板和滚动查看器高度

  •  9
  • Larry  · 技术社区  · 6 年前

    我想使用itemscontrol显示一个重要的项目列表。

    我之所以使用itemscontrol,是因为我正在开发的应用程序中的数据模板要复杂得多:提供的示例代码只反映了我所遇到的大小调整问题。

    我想:

    • 要虚拟化的项控件,因为要显示的项很多
    • 其大小将自动扩展到其父容器(网格)

      <Grid>
          <ItemsControl x:Name="My" ItemsSource="{Binding Path=Names}">
              <ItemsControl.Template>
                  <ControlTemplate>
                      <StackPanel>
                          <StackPanel>
                              <TextBlock Text="this is a title" FontSize="15" />
                              <TextBlock Text="This is a description" />
                          </StackPanel>
                          <ScrollViewer CanContentScroll="True" Height="400px">
                              <VirtualizingStackPanel IsItemsHost="True" />
                          </ScrollViewer>
                      </StackPanel>
                  </ControlTemplate>
              </ItemsControl.Template>
              <ItemsControl.ItemTemplate>
                  <DataTemplate>
                      <TextBlock Text="{Binding}" />
                  </DataTemplate>
              </ItemsControl.ItemTemplate>
          </ItemsControl>
      </Grid>
      

    后面的代码是:

    public partial class Page1: Page
    {
        public List<string> Names { get; set; }
        public Page1()
        {
            InitializeComponent();
    
            Names = new List<string>();
            for(int i = 0; i < 10000; i++)
                Names.Add("Name : " + i);
    
            My.DataContext = this;
        }
    }
    

    当我强制ScrollViewer高度为400px时,itemsControl虚拟化按我预期的方式工作:itemsControl显示列表的速度非常快,不管它包含多少项。

    但是,如果我删除height=“400px”,列表将展开其高度以显示整个列表,而不管父容器高度如何。更糟的是:看起来 后面 它的容器。

    在itemscontrol周围放置一个ScrollViewer可以获得预期的视觉效果,但是虚拟化会消失,显示列表花费的时间太多。

    如何实现项目控件的自动高度扩展和虚拟化?

    1 回复  |  直到 13 年前
        1
  •  8
  •   Anvaka    13 年前

    问题出在itemscontrol.template中:您在那里使用stackpanel,它可以给她的孩子提供所需的高度。把它换成

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel>
            <TextBlock Text="this is a title" FontSize="15" />
            <TextBlock Text="This is a description" />
        </StackPanel>
        <ScrollViewer CanContentScroll="True" Grid.Row="1">
            <VirtualizingStackPanel />
        </ScrollViewer>
    </Grid>
    

    它应该可以正常工作。

    希望它有帮助。