refactor: make DockPanel grid definitions incremental to preserve virtualization state

This commit is contained in:
2026-03-29 14:18:49 +09:00
parent 8ff98c56be
commit 257838b33e

View File

@@ -88,31 +88,58 @@ public partial class DockPanel : DockContainer
} }
} }
if (Children.Count == 0)
{
_grid.RowDefinitions.Clear(); _grid.RowDefinitions.Clear();
_grid.ColumnDefinitions.Clear(); _grid.ColumnDefinitions.Clear();
return;
if (Children.Count == 0) return; }
if (Orientation == Orientation.Horizontal) if (Orientation == Orientation.Horizontal)
{ {
_grid.RowDefinitions.Clear();
int requiredColumns = (Children.Count * 2) - 1;
while (_grid.ColumnDefinitions.Count > requiredColumns)
{
_grid.ColumnDefinitions.RemoveAt(_grid.ColumnDefinitions.Count - 1);
}
for (var i = 0; i < Children.Count; i++) for (var i = 0; i < Children.Count; i++)
{
int columnIndex = i * 2;
if (columnIndex >= _grid.ColumnDefinitions.Count)
{ {
_grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); _grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
var child = Children[i]; }
else
{
_grid.ColumnDefinitions[columnIndex].Width = new GridLength(1, GridUnitType.Star);
}
var child = Children[i];
if (!_grid.Children.Contains(child)) if (!_grid.Children.Contains(child))
{ {
_grid.Children.Add(child); _grid.Children.Add(child);
} }
Grid.SetColumn(child, i * 2); Grid.SetColumn(child, columnIndex);
Grid.SetRow(child, 0); Grid.SetRow(child, 0);
if (i < Children.Count - 1) if (i < Children.Count - 1)
{
int splitterIndex = i * 2 + 1;
if (splitterIndex >= _grid.ColumnDefinitions.Count)
{ {
_grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); _grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
}
else
{
_grid.ColumnDefinitions[splitterIndex].Width = GridLength.Auto;
}
var splitter = new GridSplitter { ResizeDirection = GridSplitter.GridResizeDirection.Columns, Width = SPLITTER_THICKNESS }; var splitter = new GridSplitter { ResizeDirection = GridSplitter.GridResizeDirection.Columns, Width = SPLITTER_THICKNESS };
Grid.SetColumn(splitter, i * 2 + 1); Grid.SetColumn(splitter, splitterIndex);
Grid.SetRow(splitter, 0); Grid.SetRow(splitter, 0);
_grid.Children.Add(splitter); _grid.Children.Add(splitter);
} }
@@ -120,24 +147,49 @@ public partial class DockPanel : DockContainer
} }
else else
{ {
_grid.ColumnDefinitions.Clear();
int requiredRows = (Children.Count * 2) - 1;
while (_grid.RowDefinitions.Count > requiredRows)
{
_grid.RowDefinitions.RemoveAt(_grid.RowDefinitions.Count - 1);
}
for (var i = 0; i < Children.Count; i++) for (var i = 0; i < Children.Count; i++)
{
int rowIndex = i * 2;
if (rowIndex >= _grid.RowDefinitions.Count)
{ {
_grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); _grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
var child = Children[i]; }
else
{
_grid.RowDefinitions[rowIndex].Height = new GridLength(1, GridUnitType.Star);
}
var child = Children[i];
if (!_grid.Children.Contains(child)) if (!_grid.Children.Contains(child))
{ {
_grid.Children.Add(child); _grid.Children.Add(child);
} }
Grid.SetRow(child, i * 2); Grid.SetRow(child, rowIndex);
Grid.SetColumn(child, 0); Grid.SetColumn(child, 0);
if (i < Children.Count - 1) if (i < Children.Count - 1)
{
int splitterIndex = i * 2 + 1;
if (splitterIndex >= _grid.RowDefinitions.Count)
{ {
_grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); _grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
}
else
{
_grid.RowDefinitions[splitterIndex].Height = GridLength.Auto;
}
var splitter = new GridSplitter { ResizeDirection = GridSplitter.GridResizeDirection.Rows, Height = SPLITTER_THICKNESS }; var splitter = new GridSplitter { ResizeDirection = GridSplitter.GridResizeDirection.Rows, Height = SPLITTER_THICKNESS };
Grid.SetRow(splitter, i * 2 + 1); Grid.SetRow(splitter, splitterIndex);
Grid.SetColumn(splitter, 0); Grid.SetColumn(splitter, 0);
_grid.Children.Add(splitter); _grid.Children.Add(splitter);
} }