feat(dock): implement grid and gridsplitter generation for groups

This commit is contained in:
2026-03-28 13:22:39 +09:00
parent ad928feea2
commit 8d49dba2f1
2 changed files with 37 additions and 16 deletions

View File

@@ -36,6 +36,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="CommunityToolkit.WinUI.Controls.Primitives" Version="8.2.251219" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.Sizers" Version="8.2.251219" />
<PackageReference Include="CommunityToolkit.WinUI.Controls.TabbedCommandBar" Version="8.2.251219" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.2" />
<PackageReference Include="Microsoft.Windows.CsWinRT" Version="2.2.0" />

View File

@@ -177,30 +177,47 @@ public sealed partial class DockLayout : Control
if (node is DockGroupNode groupNode)
{
var grid = new Grid();
var children = groupNode.Children;
bool isHorizontal = groupNode.Orientation == Orientation.Horizontal;
int childCount = groupNode.Children.Count;
for (int i = 0; i < children.Count; i++)
for (int i = 0; i < childCount; i++)
{
if (groupNode.Orientation == Orientation.Horizontal)
var childNode = groupNode.Children[i];
var childUI = CreateUIForNode(childNode);
if (isHorizontal)
{
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
Grid.SetColumn((FrameworkElement)childUI, i * 2);
}
else
{
grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) });
Grid.SetRow((FrameworkElement)childUI, i * 2);
}
var childUI = CreateUIForNode(children[i]);
if (groupNode.Orientation == Orientation.Horizontal)
grid.Children.Add(childUI);
// Add GridSplitter between children
if (i < childCount - 1)
{
Grid.SetColumn((FrameworkElement)childUI, i);
if (isHorizontal)
{
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto });
var splitter = new CommunityToolkit.WinUI.Controls.GridSplitter { Width = 4, HorizontalAlignment = HorizontalAlignment.Center, ResizeDirection = CommunityToolkit.WinUI.Controls.GridSplitter.GridResizeDirection.Columns };
Grid.SetColumn(splitter, (i * 2) + 1);
grid.Children.Add(splitter);
}
else
{
Grid.SetRow((FrameworkElement)childUI, i);
grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto });
var splitter = new CommunityToolkit.WinUI.Controls.GridSplitter { Height = 4, VerticalAlignment = VerticalAlignment.Center, ResizeDirection = CommunityToolkit.WinUI.Controls.GridSplitter.GridResizeDirection.Rows };
Grid.SetRow(splitter, (i * 2) + 1);
grid.Children.Add(splitter);
}
grid.Children.Add(childUI);
}
}
return grid;
}
else if (node is DockPanelNode panelNode)
@@ -209,7 +226,10 @@ public sealed partial class DockLayout : Control
{
TabItemsSource = panelNode.Items,
HorizontalAlignment = HorizontalAlignment.Stretch,
VerticalAlignment = VerticalAlignment.Stretch
VerticalAlignment = VerticalAlignment.Stretch,
CanDragTabs = true,
AllowDrop = true,
Tag = panelNode // Store reference to data node
};
// Bind selection state using TabView DPs