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>
<ItemGroup> <ItemGroup>
<PackageReference Include="CommunityToolkit.WinUI.Controls.Primitives" Version="8.2.251219" /> <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="CommunityToolkit.WinUI.Controls.TabbedCommandBar" Version="8.2.251219" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.2" /> <PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.2" />
<PackageReference Include="Microsoft.Windows.CsWinRT" Version="2.2.0" /> <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) if (node is DockGroupNode groupNode)
{ {
var grid = new Grid(); 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.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
Grid.SetColumn((FrameworkElement)childUI, i * 2);
} }
else else
{ {
grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(1, GridUnitType.Star) }); 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.SetColumn((FrameworkElement)childUI, i);
}
else
{
Grid.SetRow((FrameworkElement)childUI, i);
}
grid.Children.Add(childUI); grid.Children.Add(childUI);
// Add GridSplitter between children
if (i < childCount - 1)
{
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.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);
}
}
} }
return grid; return grid;
} }
else if (node is DockPanelNode panelNode) else if (node is DockPanelNode panelNode)
@@ -209,9 +226,12 @@ public sealed partial class DockLayout : Control
{ {
TabItemsSource = panelNode.Items, TabItemsSource = panelNode.Items,
HorizontalAlignment = HorizontalAlignment.Stretch, 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 // Bind selection state using TabView DPs
tabView.SetBinding(TabView.SelectedIndexProperty, new Binding tabView.SetBinding(TabView.SelectedIndexProperty, new Binding
{ {
@@ -229,7 +249,7 @@ public sealed partial class DockLayout : Control
return tabView; return tabView;
} }
Debug.Fail($"Unsupported node type: {node.GetType().Name}"); Debug.Fail($"Unsupported node type: {node.GetType().Name}");
return new Grid(); // Fallback return new Grid(); // Fallback
} }