滚动查看框提供的空间比我想要的要多

本文关键字:空间 我想要 滚动 | 更新日期: 2023-09-27 17:59:15

我有一个滚动视图框定义如下:

<ScrollViewer Width="150" Height="150" HorizontalScrollBarVisibility="Auto">
   <Grid Name="RootElement">
   </Grid>
</ScrollViewer>

在codebehind中,我用更多的网格填充网格"RootElement",

  void CreateGrid(uint _Columns, uint _Rows)
  {
     Grid layoutRoot = GetTemplateChild( "RootElement" ) as Grid;
     Random rand = new Random( );
     for(int r = 0; r < _Rows; r++)
     {
        layoutRoot.RowDefinitions.Add( new System.Windows.Controls.RowDefinition( ) { Height = new GridLength( 50, GridUnitType.Pixel ) } );
        for(int c = 0; c < _Columns; c++)
        {
           layoutRoot.ColumnDefinitions.Add( new System.Windows.Controls.ColumnDefinition( ) { Width = new GridLength( 50, GridUnitType.Pixel ) } );
           var border = new Border( );
           Grid.SetColumn( border, c );
           Grid.SetRow( border, r );
           Color col = new Color();
           col.A = (byte)rand.Next(255);
           col.R = (byte)rand.Next(255);
           col.G = (byte)rand.Next(255);
           col.B = (byte)rand.Next(255);
           border.Background = new SolidColorBrush( col );
           border.BorderBrush = new SolidColorBrush( Color.FromArgb( 0xff, 0x33, 0x33, 0x33 ) );
           layoutRoot.Children.Add( border );
        }
     }
  }

现在我的问题是,如果我在根网格(例如CreateGrid(10,10))内创建10x10网格,我最终会在滚动视图区域的右侧留下大量空白。空白似乎随着我创建的网格单元数量的增加而呈指数级增加。在垂直方向上,它很好,正常缩放,但在水平方向上有一个巨大的缺口。也许只有5%的水平空间由网格填充。

如何使滚动查看器只覆盖其中网格的空间?

滚动查看框提供的空间比我想要的要多

这是因为您的layoutRoot.ColumnDefinitions.Add()位于内部循环中。对于10列和10行,最终每1行创建10列,总共创建100列和10列。

分别对行和列进行迭代,以首先创建列/行定义。然后执行嵌套循环以创建控件。

for(int r = 0; r < _Rows; r++) {
    layoutRoot.RowDefinitions.Add( new System.Windows.Controls.RowDefinition( ) { Height = new GridLength( 50, GridUnitType.Pixel ) } );
}
for(int c = 0; c < _Columns; c++) {
    layoutRoot.ColumnDefinitions.Add( new System.Windows.Controls.ColumnDefinition( ) { Width = new GridLength( 50, GridUnitType.Pixel ) } );
}
for(int r = 0; r < _Rows; r++) {
    for(int c = 0; c < _Columns; c++) {
        var border = new Border( );
        ...
    }
}