Моя другая опция состоит в том, чтобы записать больше пользовательского кода вокруг параметров настройки приложения и выполнить его на formLoad и formClosed. Это не использует привязку данных.
Недостатки:
Прямо сейчас, это - мое предпочтительное решение, но оно походит на слишком большую работу. Для сокращения работы я создал класс WindowSettings, который сериализирует местоположение окна, размер, состояние и любые положения разделителя к единственному параметру настройки приложения. Тогда я могу просто создать установку того типа для каждой формы в моем приложении, экономить близко и восстановить на загрузке.
я отправил исходный код , включая класс WindowSettings и некоторые формы, которые используют его. Инструкции относительно добавления его к проекту включены в файл WindowSettings.cs. Самая хитрая часть выясняла, как добавить параметр настройки приложения с пользовательским типом. Вы выбираете Browse... из типа, выпадающего, и затем вручную вводите пространство имен и имя класса. Типы из Вашего проекта не обнаруживаются в списке.
Обновление: я добавил некоторые статические методы упростить шаблонный код, который Вы добавляете к каждой форме. Как только Вы следовали инструкциям для добавления класса WindowSettings к Вашему проекту и созданию параметра настройки приложения, вот пример кода, который должен быть добавлен к каждой форме, положение которой Вы хотите записать и восстановить.
private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
Settings.Default.CustomWindowSettings = WindowSettings.Record(
Settings.Default.CustomWindowSettings,
this,
splitContainer1);
}
private void MyForm_Load(object sender, EventArgs e)
{
WindowSettings.Restore(
Settings.Default.CustomWindowSettings,
this,
splitContainer1);
}
Образец ниже шоу, как я делаю это
SavePreferences, называют при закрытии формы и сохраняет размер формы и флаг, указывающий, максимизировало ли это (в этой версии, я не сохраняю, если это минимизировало - это возвратится восстановленное или максимизировало в следующий раз).
LoadPreferences называют от OnLoad.
Первое сохранение время проектирования WindowState и набор это к Нормальному. Можно только успешно установить размер формы, если это - WindowState, Нормально.
Следующее восстановление Размер от Ваших сохраненных настроек.
Теперь удостоверяются соответствия формы на Вашем экране (звоните в FitToScreen). Разрешение экрана, возможно, изменилось, так как Вы в последний раз запустили приложение.
Наконец задерживает WindowState к Максимизируемому (если сохранено как таковой), или к значению времени проектирования, сохраненному ранее.
Это могло, очевидно, быть адаптировано для сохранения положения запуска и была ли форма минимизирована, когда закрыто - я не должен был делать этого. Другие настройки для средств управления на Вашей форме, таких как положение разделителя и контейнер вкладки просты.
private void FitToScreen()
{
if (this.Width > Screen.PrimaryScreen.WorkingArea.Width)
{
this.Width = Screen.PrimaryScreen.WorkingArea.Width;
}
if (this.Height > Screen.PrimaryScreen.WorkingArea.Height)
{
this.Height = Screen.PrimaryScreen.WorkingArea.Height;
}
}
private void LoadPreferences()
{
// Called from Form.OnLoad
// Remember the initial window state and set it to Normal before sizing the form
FormWindowState initialWindowState = this.WindowState;
this.WindowState = FormWindowState.Normal;
this.Size = UserPreferencesManager.LoadSetting("_Size", this.Size);
_currentFormSize = Size;
// Fit to the current screen size in case the screen resolution
// has changed since the size was last persisted.
FitToScreen();
bool isMaximized = UserPreferencesManager.LoadSetting("_Max", initialWindowState == FormWindowState.Maximized);
WindowState = isMaximized ? FormWindowState.Maximized : FormWindowState.Normal;
}
private void SavePreferences()
{
// Called from Form.OnClosed
UserPreferencesManager.SaveSetting("_Size", _currentFormSize);
UserPreferencesManager.SaveSetting("_Max", this.WindowState == FormWindowState.Maximized);
... save other settings
}
x
Простое решение, которое я нашел, должно использовать привязку данных с параметрами настройки приложения. Я связываю местоположение и clientSize свойства на окне наряду с splitterDistance на разделителе.
Недостатки:
, Если требуется экспериментировать со странным поведением, я отправил демонстрационное решение с помощью этой техники.
Я устанавливаю Настройку для каждого значения, я хочу сохранить, и использовать код как это:
private void MainForm_Load(object sender, EventArgs e) {
RestoreState();
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e) {
SaveState();
}
private void SaveState() {
if (WindowState == FormWindowState.Normal) {
Properties.Settings.Default.MainFormLocation = Location;
Properties.Settings.Default.MainFormSize = Size;
} else {
Properties.Settings.Default.MainFormLocation = RestoreBounds.Location;
Properties.Settings.Default.MainFormSize = RestoreBounds.Size;
}
Properties.Settings.Default.MainFormState = WindowState;
Properties.Settings.Default.SplitterDistance = splitContainer1.SplitterDistance;
Properties.Settings.Default.Save();
}
private void RestoreState() {
if (Properties.Settings.Default.MainFormSize == new Size(0, 0)) {
return; // state has never been saved
}
StartPosition = FormStartPosition.Manual;
Location = Properties.Settings.Default.MainFormLocation;
Size = Properties.Settings.Default.MainFormSize;
// I don't like an app to be restored minimized, even if I closed it that way
WindowState = Properties.Settings.Default.MainFormState ==
FormWindowState.Minimized ? FormWindowState.Normal : Properties.Settings.Default.MainFormState;
splitContainer1.SplitterDistance = Properties.Settings.Default.SplitterDistance;
}
Имеют в виду, что перекомпиляция очисток файл конфигурации, где настройки хранятся, так протестируйте его, не делая изменения кода промежуточными сохранение и восстановление.
Можно использовать параметры настройки приложения для установки, какие свойства элементов управления будут сохранены в событии Form_closed, которое необходимо использовать метод сохранения на параметрах настройки приложения для записи их в диск:
Properties.Settings.Default.Save();
Вот пример некоторых, я использую меня. Это только учитывает основной монитор, таким образом, могло бы быть лучше обработать его по-другому, если используется на нескольких мониторах.
Size size;
int x;
int y;
if (WindowState.Equals(FormWindowState.Normal))
{
size = Size;
if (Location.X + size.Width > Screen.PrimaryScreen.Bounds.Width)
x = Screen.PrimaryScreen.Bounds.Width - size.Width;
else
x = Location.X;
if (Location.Y + Size.Height > Screen.PrimaryScreen.Bounds.Height)
y = Screen.PrimaryScreen.Bounds.Height - size.Height;
else
y = Location.Y;
}
else
{
size = RestoreBounds.Size;
x = (Screen.PrimaryScreen.Bounds.Width - size.Width)/2;
y = (Screen.PrimaryScreen.Bounds.Height - size.Height)/2;
}
Properties.Settings.Position.AsPoint = new Point(x, y); // Property setting is type of Point
Properties.Settings.Size.AsSize = size; // Property setting is type of Size
Properties.Settings.SplitterDistance.Value = splitContainer1.SplitterDistance; // Property setting is type of int
Properties.Settings.IsMaximized = WindowState == FormWindowState.Maximized; // Property setting is type of bool
Properties.Settings.DropDownSelection = DropDown1.SelectedValue;
Properties.Settings.Save();
Взлом можно использовать Настройки, чтобы хранить ту информацию. Все, что необходимо сделать, связывают желаемое свойство (напр. форма. Размер и форма. Местоположение) к определенной установке и это сохраняется и обновило автоматически.