#c# #silverlight #grid #code-behind #scrollviewer
#c# #silverlight #сетка #код, лежащий в основе #scrollviewer
Вопрос:
У меня есть поле просмотра прокрутки, определенное как таковое:
<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 );
}
}
}
Теперь моя проблема в том, что если я создам, скажем, сетки 10×10 внутри корневой сетки (например, CreateGrid(10,10)
), то в итоге у меня останется куча пробелов справа от области просмотра прокрутки. Кажется, что пробел увеличивается экспоненциально по мере увеличения количества создаваемых мной ячеек сетки. По вертикали все в порядке, масштабируется совершенно нормально, но по горизонтали есть огромный пробел. Возможно, только 5% горизонтального пространства заполнено сетками.
Как я могу сделать так, чтобы scrollviewer покрывал только пространство сеток внутри него?
Ответ №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( );
...
}
}
Комментарии:
1. Это была именно моя проблема, думаю, я упускал из виду очевидное. Спасибо, добрый сэр!