Scrollviewbox дает больше места, чем хотелось бы

У меня есть поле просмотра прокрутки, определенное как таковое:

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

И в отделенном коде я заполняю сетку «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 );
        }
     }
  }

Теперь моя проблема заключается в том, что если я создаю, скажем, сетки 10x10 внутри корневой сетки (например, CreateGrid(10,10)), я получаю тонну пустого пространства справа от области просмотра прокрутки. Пустое пространство, кажется, увеличивается экспоненциально по мере увеличения количества ячеек сетки, которые я создаю. По вертикали все нормально, масштабируется нормально, а вот по горизонтали огромный зазор. Может быть, только 5% горизонтального пространства заполнено сетками.

Как я могу сделать так, чтобы scrollviewer покрывал только пространство сеток внутри него?


person meds    schedule 13.06.2011    source источник


Ответы (1)


Это происходит потому, что ваш layoutRoot.ColumnDefinitions.Add() находится внутри внутреннего цикла. Для 10 столбцов и 10 строк вы в конечном итоге создаете 10 столбцов для каждой 1 строки, всего 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( );
        ...
    }
}
person Joel B Fant    schedule 14.06.2011
comment
Это была именно моя проблема, думаю, я упускал из виду очевидное. Спасибо, добрый сэр! - person meds; 14.06.2011