Skip to content

Commit 3b0870e

Browse files
authored
Merge pull request #9 from qian-o/layout-save-load
添加布局保存加载、tab 排序功能。
2 parents 0cc8fca + 4be99c0 commit 3b0870e

19 files changed

+468
-41
lines changed

Directory.Packages.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<PackageVersion Include="CommunityToolkit.WinUI.Controls.LayoutTransformControl" Version="8.1.240916" />
99
<PackageVersion Include="CommunityToolkit.WinUI.Controls.Sizers" Version="8.1.240916" />
1010
<PackageVersion Include="CommunityToolkit.WinUI.Triggers" Version="8.1.240916" />
11-
<PackageVersion Include="Microsoft.Web.WebView2" Version="1.0.3065.39" />
11+
<PackageVersion Include="Microsoft.Web.WebView2" Version="1.0.3124.44" />
1212
<PackageVersion Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.1742" />
1313
<PackageVersion Include="Microsoft.WindowsAppSDK" Version="1.6.250205002" />
1414
<PackageVersion Include="Roslynator.Analyzers" Version="4.13.1" />

src/Examples/UnoApp/MainWindow.xaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,16 @@
2222
<MenuBarItem Title="Layout">
2323
<MenuFlyoutItem Click="Save_Click"
2424
Text="Save" />
25+
<MenuFlyoutItem Click="Clear_Click"
26+
Text="Clear" />
2527
<MenuFlyoutItem Click="Open_Click"
26-
Text="Open..." />
28+
Text="Open" />
2729
</MenuBarItem>
2830
</MenuBar>
2931

3032
<dock:DockManager x:Name="dockManager"
3133
Grid.Row="1"
34+
CreateNewDocument="DockManager_CreateNewDocument"
3235
CreateNewGroup="DockManager_CreateNewGroup"
3336
CreateNewWindow="DockManager_CreateNewWindow"
3437
ParentWindow="{Binding ElementName=Main}">

src/Examples/UnoApp/MainWindow.xaml.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,27 @@ public MainWindow()
1212

1313
private void Save_Click(object _, RoutedEventArgs __)
1414
{
15-
// Save the layout.
15+
File.WriteAllText("layout.json", dockManager.SaveLayout());
16+
}
17+
18+
private void Clear_Click(object _, RoutedEventArgs __)
19+
{
20+
dockManager.ClearLayout();
1621
}
1722

1823
private void Open_Click(object _, RoutedEventArgs __)
1924
{
20-
// Open the layout.
25+
dockManager.LoadLayout(File.ReadAllText("layout.json"));
26+
}
27+
28+
private void DockManager_CreateNewDocument(object _, CreateNewDocumentEventArgs e)
29+
{
30+
e.Document.Content = new TextBlock()
31+
{
32+
HorizontalAlignment = HorizontalAlignment.Center,
33+
VerticalAlignment = VerticalAlignment.Center,
34+
Text = $"New Document {e.Title}"
35+
};
2136
}
2237

2338
private void DockManager_CreateNewGroup(object _, CreateNewGroupEventArgs e)

src/Examples/WinUIApp/MainWindow.xaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,16 @@
2222
<MenuBarItem Title="Layout">
2323
<MenuFlyoutItem Click="Save_Click"
2424
Text="Save" />
25+
<MenuFlyoutItem Click="Clear_Click"
26+
Text="Clear" />
2527
<MenuFlyoutItem Click="Open_Click"
26-
Text="Open..." />
28+
Text="Open" />
2729
</MenuBarItem>
2830
</MenuBar>
2931

3032
<dock:DockManager x:Name="dockManager"
3133
Grid.Row="1"
34+
CreateNewDocument="DockManager_CreateNewDocument"
3235
CreateNewGroup="DockManager_CreateNewGroup"
3336
CreateNewWindow="DockManager_CreateNewWindow"
3437
ParentWindow="{Binding ElementName=Main}">

src/Examples/WinUIApp/MainWindow.xaml.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,27 @@ public MainWindow()
1414

1515
private void Save_Click(object _, RoutedEventArgs __)
1616
{
17-
// Save the layout.
17+
File.WriteAllText("layout.json", dockManager.SaveLayout());
18+
}
19+
20+
private void Clear_Click(object _, RoutedEventArgs __)
21+
{
22+
dockManager.ClearLayout();
1823
}
1924

2025
private void Open_Click(object _, RoutedEventArgs __)
2126
{
22-
// Open the layout.
27+
dockManager.LoadLayout(File.ReadAllText("layout.json"));
28+
}
29+
30+
private void DockManager_CreateNewDocument(object _, CreateNewDocumentEventArgs e)
31+
{
32+
e.Document.Content = new TextBlock()
33+
{
34+
HorizontalAlignment = HorizontalAlignment.Center,
35+
VerticalAlignment = VerticalAlignment.Center,
36+
Text = $"New Document {e.Title}"
37+
};
2338
}
2439

2540
private void DockManager_CreateNewGroup(object _, CreateNewGroupEventArgs e)

src/Examples/WinUIApp/WinUIApp.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
<TargetFramework>net9.0-windows10.0.22621.0</TargetFramework>
66
<UseWinUI>true</UseWinUI>
77
<Platforms>x86;x64;ARM64</Platforms>
8+
<EnableMsixTooling>true</EnableMsixTooling>
89
<ApplicationManifest>app.manifest</ApplicationManifest>
910
</PropertyGroup>
1011

1112
<PropertyGroup>
13+
<WindowsPackageType>None</WindowsPackageType>
1214
<WindowsAppSdkSelfContained>true</WindowsAppSdkSelfContained>
13-
<WindowsPackageType>none</WindowsPackageType>
1415
</PropertyGroup>
1516

1617
<Choose>
@@ -28,7 +29,6 @@
2829
</Otherwise>
2930
</Choose>
3031

31-
3232
<ItemGroup>
3333
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" />
3434
<PackageReference Include="Microsoft.WindowsAppSDK" />

src/WinUI.Dock/Abstracts/DockContainer.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ protected DockContainer()
1313

1414
public ObservableCollection<DockModule> Children { get; } = [];
1515

16+
internal bool IsListening { get; set; } = true;
17+
1618
public void DetachEmptyContainer()
1719
{
1820
for (int i = Children.Count - 1; i >= 0; i--)
@@ -56,6 +58,11 @@ protected override void OnRootChanged(DockManager? oldRoot, DockManager? newRoot
5658

5759
private void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
5860
{
61+
if (!IsListening)
62+
{
63+
return;
64+
}
65+
5966
if (ValidateChildren())
6067
{
6168
UnloadChildren();

src/WinUI.Dock/Abstracts/DockModule.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace WinUI.Dock.Abstracts;
1+
using System.Text.Json.Nodes;
2+
3+
namespace WinUI.Dock.Abstracts;
24

35
public abstract class DockModule : Control
46
{
@@ -138,6 +140,10 @@ protected virtual void OnRootChanged(DockManager? oldRoot, DockManager? newRoot)
138140
{
139141
}
140142

143+
internal abstract void SaveLayout(JsonObject writer);
144+
145+
internal abstract void LoadLayout(JsonObject reader);
146+
141147
private void OnSizeChanged(object sender, SizeChangedEventArgs e)
142148
{
143149
DockWidth = ActualWidth;

src/WinUI.Dock/Controls/DockWindow.xaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
</Grid>
2727

2828
<dock:LayoutPanel x:Name="Panel"
29-
Grid.Row="1" />
29+
Grid.Row="1"
30+
x:FieldModifier="internal" />
3031
</Grid>
3132
</Window>

src/WinUI.Dock/Controls/DockWindow.xaml.cs

Lines changed: 61 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using Microsoft.UI.Windowing;
1+
using System.Text.Json;
2+
using System.Text.Json.Nodes;
3+
using Microsoft.UI.Windowing;
24
using Microsoft.UI.Xaml.Controls.Primitives;
35
using Windows.Graphics;
46
using WinUI.Dock.Helpers;
@@ -9,15 +11,53 @@ public sealed partial class DockWindow : Window
911
{
1012
private PointInt32 dragOffset;
1113

12-
public DockWindow(DockManager manager, Document document)
14+
public DockWindow(DockManager manager, Document? document)
1315
{
1416
InitializeComponent();
1517

1618
InitializePanel(manager, document);
1719
InitializeWindow(manager, document);
1820
}
1921

20-
private void InitializePanel(DockManager manager, Document document)
22+
internal void SaveLayout(JsonObject writer)
23+
{
24+
writer["Position"] = new JsonObject
25+
{
26+
["X"] = AppWindow.Position.X,
27+
["Y"] = AppWindow.Position.Y
28+
};
29+
30+
writer["Size"] = new JsonObject
31+
{
32+
["Width"] = AppWindow.Size.Width,
33+
["Height"] = AppWindow.Size.Height
34+
};
35+
36+
JsonObject panelWriter = [];
37+
38+
Panel.SaveLayout(panelWriter);
39+
40+
writer[nameof(Panel)] = panelWriter;
41+
}
42+
43+
internal void LoadLayout(JsonObject reader)
44+
{
45+
AppWindow.Move(new()
46+
{
47+
X = reader["Position"]!.AsObject()["X"].Deserialize<int>(LayoutHelpers.SerializerOptions),
48+
Y = reader["Position"]!.AsObject()["Y"].Deserialize<int>(LayoutHelpers.SerializerOptions)
49+
});
50+
51+
AppWindow.Resize(new()
52+
{
53+
Width = reader["Size"]!.AsObject()["Width"].Deserialize<int>(LayoutHelpers.SerializerOptions),
54+
Height = reader["Size"]!.AsObject()["Height"].Deserialize<int>(LayoutHelpers.SerializerOptions)
55+
});
56+
57+
Panel.LoadLayout(reader[nameof(Panel)]!.AsObject());
58+
}
59+
60+
private void InitializePanel(DockManager manager, Document? document)
2161
{
2262
Panel.Root = manager;
2363

@@ -29,18 +69,21 @@ private void InitializePanel(DockManager manager, Document document)
2969
}
3070
};
3171

32-
document.Detach();
72+
if (document is not null)
73+
{
74+
document.Detach();
3375

34-
DocumentGroup group = new();
35-
group.Children.Add(document);
76+
DocumentGroup group = new();
77+
group.Children.Add(document);
3678

37-
LayoutPanel panel = new() { Orientation = Orientation.Horizontal };
38-
panel.Children.Add(group);
79+
LayoutPanel panel = new() { Orientation = Orientation.Horizontal };
80+
panel.Children.Add(group);
3981

40-
Panel.Children.Add(panel);
82+
Panel.Children.Add(panel);
83+
}
4184
}
4285

43-
private void InitializeWindow(DockManager manager, Document document)
86+
private void InitializeWindow(DockManager manager, Document? document)
4487
{
4588
Closed += (_, _) => DockWindowHelpers.RemoveWindow(manager, this);
4689

@@ -51,11 +94,15 @@ private void InitializeWindow(DockManager manager, Document document)
5194
#endif
5295

5396
AppWindow.Move(PointerHelpers.GetPointerPosition());
54-
AppWindow.Resize(new()
97+
98+
if (document is not null)
5599
{
56-
Width = (int)(double.IsNaN(document.DockWidth) ? 400 : document.DockWidth),
57-
Height = (int)(double.IsNaN(document.DockHeight) ? 400 : document.DockHeight)
58-
});
100+
AppWindow.Resize(new()
101+
{
102+
Width = (int)(double.IsNaN(document.DockWidth) ? 400 : document.DockWidth),
103+
Height = (int)(double.IsNaN(document.DockHeight) ? 400 : document.DockHeight)
104+
});
105+
}
59106

60107
manager.InvokeCreateNewWindow(TitleBar);
61108

0 commit comments

Comments
 (0)