正如其他人已经指出的那样,您必须存储窗口的属性以在启动之间保持它们。为了设置Window 的位置,您必须将WindowStartupLocation 设置为WindowStartupLocation.Manual。您必须从 App.xaml.cs 手动启动主窗口。
为了更改 WPF 启动应用程序的方式,您必须修改 App.xaml 并将活动属性 StartupUri 更改为事件处理程序属性 Startup 并分配处理程序方法给它(在这种情况下名为Run):
<Application x:Class="WpfTestRange.Main.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="Run">
</Application>
然后在App.xaml.cs中实现handler,手动启动主窗口:
private void Run(object sender, StartupEventArgs e)
{
this.MainWindow = new MainWindow();
this.MainWindow.Closing += SaveWindowAttributes;
RestoreWindow();
this.MainWindow.Show();
}
protected void RestoreWindow()
{
this.MainWindow.WindowStartupLocation = WindowStartupLocation.Manual;
var reader = new AppSettingsReader();
string windowStateValue;
try
{
windowStateValue = reader.GetValue("WindowState", typeof(string)) as string;
}
catch (InvalidOperationException)
{
// There are no previously persisted values (first launch)
return;
}
WindowState windowState;
if (!string.IsNullOrWhiteSpace(windowStateValue) && Enum.TryParse(windowStateValue, out windowState))
{
this.MainWindow.WindowState = windowState;
}
string windowTopValue = reader.GetValue("WindowPositionTop", typeof(string)) as string;
string windowLeftValue = reader.GetValue("WindowPositionLeft", typeof(string)) as string;
double windowPositionTop;
double windowPositionLeft;
if (!string.IsNullOrWhiteSpace(windowStateValue)
&& double.TryParse(windowTopValue, out windowPositionTop)
&& double.TryParse(windowLeftValue, out windowPositionLeft))
{
this.MainWindow.Top = windowPositionTop;
this.MainWindow.Left = windowPositionLeft;
}
}
private void SaveWindowAttributes(object sender, CancelEventArgs e)
{
string sectionName = "appSettings";
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
string currentWindowState = this.MainWindow.WindowState.ToString();
if (config.AppSettings.Settings["WindowState"] == null)
{
config.AppSettings.Settings.Add("WindowState", currentWindowState);
}
else
{
config.AppSettings.Settings["WindowState"].Value = currentWindowState;
}
string currentWindowPositionTop = this.MainWindow.Top.ToString("G");
if (config.AppSettings.Settings["WindowPositionTop"] == null)
{
config.AppSettings.Settings.Add("WindowPositionTop", currentWindowPositionTop);
}
else
{
config.AppSettings.Settings["WindowPositionTop"].Value = currentWindowPositionTop;
}
string currentWindowPositionLeft = this.MainWindow.Left.ToString("G");
if (config.AppSettings.Settings["WindowPositionLeft"] == null)
{
config.AppSettings.Settings.Add("WindowPositionLeft", currentWindowPositionLeft);
}
else
{
config.AppSettings.Settings["WindowPositionLeft"].Value = currentWindowPositionLeft;
}
config.Save(ConfigurationSaveMode.Full);
ConfigurationManager.RefreshSection(sectionName);
}