增加侧边栏折叠功能

This commit is contained in:
ww-rm
2025-10-19 01:01:34 +08:00
parent f5d3f93cde
commit dae5d0b7c7
2 changed files with 92 additions and 12 deletions

View File

@@ -18,6 +18,7 @@ namespace SpineViewer.Models
public double WindowHeight { get; set; }
public WindowState WindowState { get; set; }
public bool RootGridCol0Folded { get; set; }
public double RootGridCol0Width { get; set; }
public double RootGridCol2Width { get; set; }

View File

@@ -49,6 +49,37 @@ public partial class MainWindow : Window
private DispatcherTimer _saveUserStateTimer;
private readonly TimeSpan _saveTimerDelay = TimeSpan.FromSeconds(3);
public bool RootGridCol0Folded
{
get => ((ContentPresenter)_mainTabControl.Template.FindName("PART_SelectedContentHost", _mainTabControl)).Visibility != Visibility.Visible;
set
{
var mainTabContentHost = (ContentPresenter)_mainTabControl.Template.FindName("PART_SelectedContentHost", _mainTabControl);
if ((mainTabContentHost.Visibility != Visibility.Visible) == value)
return;
if (value)
{
// 寄存折叠前的宽度比例
_rootGrid.ColumnDefinitions[0].Tag = _rootGrid.ColumnDefinitions[0].Width;
_rootGrid.ColumnDefinitions[1].Tag = _rootGrid.ColumnDefinitions[1].Width;
_rootGrid.ColumnDefinitions[2].Tag = _rootGrid.ColumnDefinitions[2].Width;
// 进行折叠
mainTabContentHost.Visibility = Visibility.Collapsed;
_rootGrid.ColumnDefinitions[0].Width = GridLength.Auto;
_rootGrid.ColumnDefinitions[1].Width = new(0);
}
else
{
// 解除折叠
_rootGrid.ColumnDefinitions[0].Width = (GridLength)_rootGrid.ColumnDefinitions[0].Tag;
_rootGrid.ColumnDefinitions[1].Width = (GridLength)_rootGrid.ColumnDefinitions[1].Tag;
_rootGrid.ColumnDefinitions[2].Width = (GridLength)_rootGrid.ColumnDefinitions[2].Tag;
mainTabContentHost.Visibility = Visibility.Visible;
}
}
}
public MainWindow()
{
InitializeComponent();
@@ -231,8 +262,18 @@ public partial class MainWindow : Window
WindowState = WindowState.Normal;
}
_rootGrid.ColumnDefinitions[0].Width = new(m.RootGridCol0Width, GridUnitType.Star);
_rootGrid.ColumnDefinitions[2].Width = new(m.RootGridCol2Width, GridUnitType.Star);
if (m.RootGridCol0Folded)
{
RootGridCol0Folded = true;
_rootGrid.ColumnDefinitions[0].Tag = new GridLength(m.RootGridCol0Width, GridUnitType.Star);
_rootGrid.ColumnDefinitions[2].Tag = new GridLength(m.RootGridCol2Width, GridUnitType.Star);
}
else
{
RootGridCol0Folded = false;
_rootGrid.ColumnDefinitions[0].Width = new(m.RootGridCol0Width, GridUnitType.Star);
_rootGrid.ColumnDefinitions[2].Width = new(m.RootGridCol2Width, GridUnitType.Star);
}
_modelListGrid.RowDefinitions[0].Height = new(m.ModelListRow0Height, GridUnitType.Star);
_modelListGrid.RowDefinitions[2].Height = new(m.ModelListRow2Height, GridUnitType.Star);
@@ -263,6 +304,7 @@ public partial class MainWindow : Window
WindowHeight = rb.Height,
WindowState = WindowState,
RootGridCol0Folded = RootGridCol0Folded,
RootGridCol0Width = _rootGrid.ColumnDefinitions[0].Width.Value,
RootGridCol2Width = _rootGrid.ColumnDefinitions[2].Width.Value,
@@ -284,6 +326,12 @@ public partial class MainWindow : Window
BackgroundImageMode = _vm.SFMLRendererViewModel.BackgroundImageMode,
};
if (m.RootGridCol0Folded)
{
m.RootGridCol0Width = ((GridLength)_rootGrid.ColumnDefinitions[0].Tag).Value;
m.RootGridCol2Width = ((GridLength)_rootGrid.ColumnDefinitions[2].Tag).Value;
}
JsonHelper.Serialize(m, UserStateFilePath);
}
@@ -387,6 +435,34 @@ public partial class MainWindow : Window
#endregion
#region _mainTabControl
private void MainTabControlHeader_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// 全屏状态忽略该功能
if (_fullScreenLayout.Visibility == Visibility.Visible)
return;
if (sender is not FrameworkElement fe)
return;
// 找到包含这个 Border 的 TabItem
var tabItem = VisualFindParent<TabItem>(fe);
if (tabItem is null)
return;
if (_mainTabControl.SelectedItem == tabItem)
{
RootGridCol0Folded = !RootGridCol0Folded;
}
else
{
RootGridCol0Folded = false;
}
}
#endregion
#region _spinesListView
private void SpinesListView_RequestSelectionChanging(object? sender, NotifyCollectionChangedEventArgs e)
@@ -506,13 +582,6 @@ public partial class MainWindow : Window
e.Handled = true;
}
private static T? VisualUpwardSearch<T>(DependencyObject? source) where T : DependencyObject
{
while (source != null && source is not T)
source = VisualTreeHelper.GetParent(source);
return source as T;
}
#endregion
#region _spineFilesListBox
@@ -553,6 +622,8 @@ public partial class MainWindow : Window
if (_fullScreenLayout.Visibility == Visibility.Visible) return;
RootGridCol0Folded = false; // 取消折叠
IntPtr hwnd = new WindowInteropHelper(this).Handle;
if (User32.GetScreenResolution(hwnd, out var resX, out var resY))
{
@@ -803,6 +874,15 @@ public partial class MainWindow : Window
#endregion
private static T? VisualUpwardSearch<T>(DependencyObject? source) where T : DependencyObject
{
while (source != null && source is not T)
source = VisualTreeHelper.GetParent(source);
return source as T;
}
public static T? VisualFindParent<T>(DependencyObject child) where T : DependencyObject
=> VisualUpwardSearch<T>(VisualTreeHelper.GetParent(child));
private void DebugMenuItem_Click(object sender, RoutedEventArgs e)
{
@@ -812,9 +892,8 @@ public partial class MainWindow : Window
_logger.Warn("Warn");
_logger.Error("Error");
_logger.Fatal("Fatal");
var _tabContentHost = (ContentPresenter?)_mainTabControl.Template.FindName("PART_SelectedContentHost", _mainTabControl);
_mainTabControl.Visibility = Visibility.Collapsed;
return;
#endif
}
}