namespace v2rayN.Desktop.Base; public class WindowBase : ReactiveWindow where TViewModel : class { public WindowBase() { Loaded += OnLoaded; Loaded += (s, e) => { if (Owner != null && !ShowInTaskbar) { CanMinimize = false; } }; } private void ReactiveWindowBase_Closed(object? sender, EventArgs e) { throw new NotImplementedException(); } protected virtual void OnLoaded(object? sender, RoutedEventArgs e) { try { var sizeItem = ConfigHandler.GetWindowSizeItem(AppManager.Instance.Config, GetType().Name); if (sizeItem is null) { return; } var screen = Screens.ScreenFromWindow(this) ?? Screens.Primary; var scaling = screen.Scaling > 0 ? screen.Scaling : 1.0; var workingArea = screen.WorkingArea; var width = Math.Min(sizeItem.Width, workingArea.Width / scaling); var height = Math.Min(sizeItem.Height, workingArea.Height / scaling); Width = width; Height = height; var frameDiff = (FrameSize ?? ClientSize) - ClientSize; var totalWidth = (width + frameDiff.Width) * scaling; var totalHeight = (height + frameDiff.Height) * scaling; var x = workingArea.X + ((workingArea.Width - totalWidth) / 2); var y = workingArea.Y + ((workingArea.Height - totalHeight) / 2); Position = new PixelPoint((int)x, (int)y); } catch { } } protected override void OnClosed(EventArgs e) { base.OnClosed(e); try { ConfigHandler.SaveWindowSizeItem(AppManager.Instance.Config, GetType().Name, Width, Height); } catch { } } }