Большое спасибо за то, что поделились вашим кодом, для меня было очень полезно построить мою Grid с помощью freeze Columns and Row. Надеюсь, это поможет и другим.
Вам необходимо изменить начальные позиции следующих элементов в соответствии с вашим макетом,
(ScrollableGrid,
HScrollBar,
VScrollBar,
colHeaderContainer,
rowHeaderContainer)
private Grid theGrid = new Grid();
private Canvas gridContainer = new Canvas();
private Canvas colHeader = new Canvas();
private StackPanel colHeaderContainer = new StackPanel();
private Canvas rowHeader = new Canvas();
private StackPanel rowHeaderContainer = new StackPanel();
private Canvas scrollableGrid = new Canvas();
private Border firstRowfirstColCell = new Border();
private ScrollBar hScrollBar = new ScrollBar();
private ScrollBar vScrollBar = new ScrollBar();
private void BuildTheGrid()
{
for (int i = 0; i <= 10; i++)
{
ColumnDefinition cdef = new ColumnDefinition();
cdef.Width = new GridLength(100);
theGrid.ColumnDefinitions.Add(cdef);
}
for (int i = 0; i <= 8; i++)
{
RowDefinition rdef = new RowDefinition();
rdef.Height = new GridLength(50);
theGrid.RowDefinitions.Add(rdef);
}
for (int i = 0; i <= 10; i++)
{
for (int j = 0; j <= 8; j++)
{
Border mbrd = new Border();
mbrd.BorderBrush = new SolidColorBrush(Colors.Black);
mbrd.BorderThickness = new Thickness(1);
mbrd.Width = 100;
mbrd.Height = 50;
mbrd.SetValue(Grid.RowProperty, j);
mbrd.SetValue(Grid.ColumnProperty, i);
StackPanel sp = new StackPanel();
sp.AllowDrop = true;
sp.Background = new SolidColorBrush(Colors.LightGray);
sp.SetValue(Grid.RowProperty, j);
sp.SetValue(Grid.ColumnProperty, i);
TextBlock txt = new TextBlock();
txt.Text = "Row=" + j.ToString() + " Col=" + i.ToString();
sp.Children.Add(txt);
theGrid.Children.Add(sp);
theGrid.Children.Add(mbrd);
}
}
gridContainer.Children.Add(theGrid);
Canvas.SetLeft(scrollableGrid, 200);
Canvas.SetTop(scrollableGrid, 100);
scrollableGrid.Children.Add(gridContainer);
scrollableGrid.Width = 100;
RectangleGeometry recClip = new RectangleGeometry();
recClip.Rect = new Rect(0, 0, 880, 350);
scrollableGrid.Clip = recClip;
this.LayoutRoot.Children.Add(scrollableGrid);
SetScrollbars();
AddColumnHeader();
AddRowHeader();
this.LayoutRoot.Children.Add(firstRowfirstColCell);
firstRowfirstColCell.BorderBrush = new SolidColorBrush(Colors.Black);
firstRowfirstColCell.BorderThickness = new Thickness(1);
firstRowfirstColCell.Width = 100;
firstRowfirstColCell.Height = 50;
firstRowfirstColCell.Background = new SolidColorBrush(Colors.Red);
Canvas.SetLeft(firstRowfirstColCell, 0);
Canvas.SetTop(firstRowfirstColCell, 0);
theGrid.MouseWheel += theGrid_MouseWheel;
}
private void SetScrollbars()
{
hScrollBar.Orientation = Orientation.Horizontal;
Canvas.SetLeft(hScrollBar, 200);
Canvas.SetTop(hScrollBar, 450);
hScrollBar.Width = 880;
hScrollBar.ViewportSize = 100;
hScrollBar.Maximum = 220;
hScrollBar.Minimum = 0;
hScrollBar.SmallChange = 10;
hScrollBar.LargeChange = 15;
hScrollBar.Value = 0;
hScrollBar.Scroll += hScrollBar_Scroll;
this.LayoutRoot.Children.Add(hScrollBar);
vScrollBar.Orientation = Orientation.Vertical;
Canvas.SetLeft(vScrollBar, 1080);
Canvas.SetTop(vScrollBar, 100);
vScrollBar.Height = 350;
vScrollBar.ViewportSize = 100;
vScrollBar.Maximum = 100;
vScrollBar.Minimum = 0;
vScrollBar.SmallChange = 5;
vScrollBar.LargeChange = 10;
vScrollBar.Value = 0;
vScrollBar.Scroll += vScrollBar_Scroll;
this.LayoutRoot.Children.Add(vScrollBar);
}
private void AddColumnHeader()
{
colHeaderContainer.Orientation = Orientation.Horizontal;
//for (int i = 0; i <= 3; i++)
//{
// Border mbrd = new Border();
// mbrd.BorderBrush = new SolidColorBrush(Colors.Red);
// mbrd.BorderThickness = new Thickness(1);
// mbrd.Width = 100;
// mbrd.Height = 50;
// colHeaderContainer.Children.Add(mbrd);
//}
Grid columnGrid = new Grid();
columnGrid.ShowGridLines = true;
for (int i = 0; i <= 10; i++)
{
ColumnDefinition cdef = new ColumnDefinition();
cdef.Width = new GridLength(100);
columnGrid.ColumnDefinitions.Add(cdef);
}
for (int i = 0; i <= 1; i++)
{
RowDefinition rdef = new RowDefinition();
rdef.Height = new GridLength(50);
columnGrid.RowDefinitions.Add(rdef);
}
for (int i = 0; i <= 10; i++)
{
for (int j = 0; j <= 1; j++)
{
Border mbrd = new Border();
mbrd.BorderBrush = new SolidColorBrush(Colors.Black);
mbrd.BorderThickness = new Thickness(1);
mbrd.Width = 100;
mbrd.Height = 50;
mbrd.SetValue(Grid.RowProperty, j);
mbrd.SetValue(Grid.ColumnProperty, i);
StackPanel sp = new StackPanel();
sp.AllowDrop = true;
sp.Background = new SolidColorBrush(Colors.Yellow);
sp.SetValue(Grid.RowProperty, j);
sp.SetValue(Grid.ColumnProperty, i);
TextBlock txt = new TextBlock();
txt.Text = "Freez Col=" + i.ToString();
sp.Children.Add(txt);
columnGrid.Children.Add(sp);
columnGrid.Children.Add(mbrd);
}
}
colHeaderContainer.Children.Add(columnGrid);
colHeader.Children.Add(colHeaderContainer);
Canvas.SetLeft(colHeader, 200);
Canvas.SetTop(colHeader, 0);
RectangleGeometry colHeaderrecClip = new RectangleGeometry();
colHeaderrecClip.Rect = new Rect(0, 0, 880, 150);
colHeader.Clip = colHeaderrecClip;
this.LayoutRoot.Children.Add(colHeader);
}
private void AddRowHeader()
{
rowHeaderContainer.Orientation = Orientation.Vertical;
//for (int i = 0; i <= 8; i++)
//{
// Border mbrd = new Border();
// mbrd.BorderBrush = new SolidColorBrush(Colors.Black);
// mbrd.BorderThickness = new Thickness(1);
// mbrd.Width = 100;
// mbrd.Height = 50;
// rowHeaderContainer.Children.Add(mbrd);
//}
Grid rowGrid = new Grid();
rowGrid.ShowGridLines = true;
for (int i = 0; i <= 3; i++)
{
ColumnDefinition cdef = new ColumnDefinition();
cdef.Width = new GridLength(100);
rowGrid.ColumnDefinitions.Add(cdef);
}
for (int i = 0; i <= 10; i++)
{
RowDefinition rdef = new RowDefinition();
rdef.Height = new GridLength(50);
rowGrid.RowDefinitions.Add(rdef);
}
for (int i = 0; i <= 2; i++)
{
for (int j = 0; j <= 10; j++)
{
Border mbrd = new Border();
mbrd.BorderBrush = new SolidColorBrush(Colors.Black);
mbrd.BorderThickness = new Thickness(1);
mbrd.Width = 100;
mbrd.Height = 50;
mbrd.SetValue(Grid.RowProperty, j);
mbrd.SetValue(Grid.ColumnProperty, i);
StackPanel sp = new StackPanel();
sp.AllowDrop = true;
sp.Background = new SolidColorBrush(Colors.Blue);
sp.SetValue(Grid.RowProperty, j);
sp.SetValue(Grid.ColumnProperty, i);
TextBlock txt = new TextBlock();
txt.Text = "Freez Row=" + i.ToString();
sp.Children.Add(txt);
rowGrid.Children.Add(sp);
rowGrid.Children.Add(mbrd);
}
}
rowHeaderContainer.Children.Add(rowGrid);
rowHeader.Children.Add(rowHeaderContainer);
Canvas.SetLeft(rowHeader, 0);
Canvas.SetTop(rowHeader, 100);
RectangleGeometry rowHeaderrecClip = new RectangleGeometry();
rowHeaderrecClip.Rect = new Rect(0, 0, 200, 350);
rowHeader.Clip = rowHeaderrecClip;
this.LayoutRoot.Children.Add(rowHeader);
}
private void hScrollBar_Scroll(object sender, ScrollEventArgs e)
{
gridContainer.SetValue(Canvas.LeftProperty, -hScrollBar.Value);
colHeaderContainer.SetValue(Canvas.LeftProperty, -hScrollBar.Value);
}
private void vScrollBar_Scroll(object sender, ScrollEventArgs e)
{
gridContainer.SetValue(Canvas.TopProperty, -vScrollBar.Value);
rowHeaderContainer.SetValue(Canvas.TopProperty, -vScrollBar.Value);
}
private void theGrid_MouseWheel(object sender, MouseWheelEventArgs e)
{
vScrollBar.Value += e.Delta > 0 ? -vScrollBar.LargeChange : vScrollBar.LargeChange;
gridContainer.SetValue(Canvas.TopProperty, -vScrollBar.Value);
rowHeaderContainer.SetValue(Canvas.TopProperty, -vScrollBar.Value);
}