【发布时间】:2019-12-16 12:14:09
【问题描述】:
我正在尝试在我的 WPF 应用程序中实现存储和恢复主窗口状态和大小。我当前的代码如下所示:
-
MainWindowViewModel.cs(在主窗口的
OnLoaded上运行):public void NotifyLoaded() { var uiConfig = configurationService.Configuration.UI; if (uiConfig.MainWindowSizeSet.Value) access.SetWindowSize(new System.Windows.Size(uiConfig.MainWindowWidth.Value, uiConfig.MainWindowHeight.Value)); if (uiConfig.MainWindowLocationSet.Value) access.SetWindowLocation(new System.Windows.Point(uiConfig.MainWindowX.Value, uiConfig.MainWindowY.Value)); if (uiConfig.MainWindowMaximized.Value) access.SetWindowMaximized(true); } -
access是一个IMainWindowAccess,由MainWindow本身实现(这是我在视图模型和窗口之间提供通信的方式,同时仍然保持逻辑和视图分离)。方法的实现方式如下:void IMainWindowAccess.SetWindowSize(Size size) { this.Width = size.Width; this.Height = size.Height; } void IMainWindowAccess.SetWindowLocation(Point point) { this.Left = point.X; this.Top = point.Y; } void IMainWindowAccess.SetWindowMaximized(bool maximized) { this.WindowState = maximized ? WindowState.Maximized : WindowState.Normal; } -
我在关闭窗口时存储窗口位置和大小,但前提是窗口未最大化。我这样做是为了避免用户尝试恢复窗口并将其恢复到最大化大小时的情况。
public void NotifyClosingWindow() { var windowSize = access.GetWindowSize(); var windowLocation = access.GetWindowLocation(); var maximized = access.GetMaximized(); configurationService.Configuration.UI.MainWindowMaximized.Value = maximized; if (!maximized) { Models.Configuration.UI.UIConfig uiConfig = configurationService.Configuration.UI; uiConfig.MainWindowWidth.Value = windowSize.Width; uiConfig.MainWindowHeight.Value = windowSize.Height; uiConfig.MainWindowSizeSet.Value = true; uiConfig.MainWindowX.Value = windowLocation.X; uiConfig.MainWindowY.Value = windowLocation.Y; uiConfig.MainWindowLocationSet.Value = true; } configurationService.Save(); }
问题在于,虽然我在最大化窗口之前恢复了窗口的大小和位置(因此它应该恢复到以前的大小),但它仍然恢复到最大化的大小(有效地单击恢复按钮会改变最大化按钮 - 大小和位置保持不变)。
我应该如何设置窗口的大小和位置,然后最大化它,以便正确存储大小和位置?
【问题讨论】:
-
您是否尝试过管理
Window.StateChanged事件?
标签: c# .net wpf window maximize