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)


arrow_upward
2
arrow_downward

Это происходит потому, что ваш 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