With 3 ScrollvVewer it's perfect. Now I've these in MainWindow.xaml.cs
:
public partial class MainWindow : Window
{
Grid topGrid, sideGrid, mainGrid;
public MainWindow() {
InitializeComponent();
generateMainGrid();
generateSideGid();
generateTopGrid();
}
void generateMainGrid() {
mainGrid = new Grid() { ShowGridLines = true };
for (int i = 0; i < 40; i++) {
mainGrid.RowDefinitions.Add(new RowDefinition() { SharedSizeGroup = "row" + i});
mainGrid.ColumnDefinitions.Add(new ColumnDefinition() { SharedSizeGroup = "col" + i });
var rect = new Border() { Name = "rect" + i };
Grid.SetColumn(rect, i);
mainGrid.Children.Add(rect);
}
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 10; j++) {
var block = new TextBlock() {
Text = "Text " + i + " " + j, FontSize = 25,
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center
};
Grid.SetRow(block, i);
Grid.SetColumn(block, j);
mainGrid.Children.Add(block);
}
}
mainScroll.Content = mainGrid;
}
void generateSideGid() {
sideGrid = new Grid() { ShowGridLines = true };
for (int i = 0; i < 20; i++) {
sideGrid.RowDefinitions.Add(new RowDefinition() { SharedSizeGroup = "row" + i});
var block = new TextBlock() { Text = "Row " + "\n" + i, FontSize = 25 };
Grid.SetRow(block, i);
sideGrid.Children.Add(block);
}
sideScroll.Margin = new Thickness(0, 0, 0, SystemParameters.HorizontalScrollBarHeight);
sideScroll.Content = sideGrid;
}
void generateTopGrid() {
topGrid = new Grid() { ShowGridLines = true };
for (int i = 0; i < 10; i++) {
var cd = new ColumnDefinition() { SharedSizeGroup = "col" + i};
topGrid.ColumnDefinitions.Add(cd);
var block = new TextBlock() {
Text = "Col " + i, FontSize = 25,
HorizontalAlignment = HorizontalAlignment.Center
};
Grid.SetColumn(block, i);
topGrid.Children.Add(block);
}
topScroll.Margin = new Thickness(0, 0, SystemParameters.VerticalScrollBarWidth, 0);
topScroll.Content = topGrid;
}
void mainScrollChanged(object sender, ScrollChangedEventArgs e) {
sideScroll.ScrollToVerticalOffset(e.VerticalOffset);
topScroll.ScrollToHorizontalOffset(e.HorizontalOffset);
}
}
and these in MainWindow.xaml
:
<Grid Grid.IsSharedSizeScope="True">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ScrollViewer x:Name="topScroll"
Grid.Column="1"
VerticalScrollBarVisibility="Hidden"
HorizontalScrollBarVisibility="Hidden"/>
<ScrollViewer x:Name="sideScroll"
Grid.Row="1"
VerticalScrollBarVisibility="Hidden"
HorizontalScrollBarVisibility="Hidden"/>
<ScrollViewer x:Name="mainScroll"
Grid.Row="1"
Grid.Column="1"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto"
ScrollChanged="mainScrollChanged"/>
</Grid>
and this is what I get: