От скуки нарисовал более простое решение - custom panel, которая отображает сетку с ячейками фиксированного размера. Border-ы, Background-ы ячеек - на ваше усмотрение в методах CreateCell и BindCell.
Пробовал 1 млн х 1 млн ячеек - никаких тормозов. Отображается только то, что видно на экране.
<Window x:Class="GridTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:GridTest"
Title="Square Grid Test" Height="350" Width="525">
<ScrollViewer CanContentScroll="True"
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible">
<local:SquareGrid x:Name="Grid">
</local:SquareGrid>
</ScrollViewer>
</Window>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace GridTest
{
public partial class MainWindow : Window, SquareGrid.ICellGenerator
{
public MainWindow()
{
InitializeComponent();
Grid.RowCount = 1000;
Grid.ColumnCount = 1000;
Grid.CellWidth = 36;
Grid.CellGenerator = this;
}
public UIElement CreateCell()
{
return new Border
{
Child = new TextBlock
{
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
FontSize = 10
},
BorderBrush = Brushes.LightGray,
BorderThickness = new Thickness(0, 0, 1, 1)
};
}
public void BindCell(UIElement view, int x, int y)
{
var border = (Border)view;
var textBlock = (TextBlock)border.Child;
textBlock.Text = "" + x + ":" + y;
}
}
}
public sealed class SquareGrid : Panel, IScrollInfo
{
// Подробности сюда не влезли,
// см. SquareGrid.cs
}
SquareGrid.cs
Проект целиком:
SquareGrid.zip