Сообщений 7    Оценка 79        Оценить  
Система Orphus

Сохранение размеров и расположения формы при помощи Application Settings

Автор: Raghavendra Prabhu
Microsoft Corporation

Перевод: Алексей Кирюшкин
The RSDN Group

Источник: Cool Client Stuff
Материал предоставил: RSDN Magazine #2-2006
Опубликовано: 21.06.2006
Исправлено: 30.07.2006
Версия текста: 1.1

Довольно часто от приложений Windows Forms требуется способность запоминать расположение и размер форм при закрытии и восстанавливать их при последующем открытии. Application Settings в .NET 2.0 позволяют реализовать это очень просто, но, к сожалению, получается при этом не совсем то, что нужно. Частое появление этого вопроса на внутренних и внешних форумах Microsoft и сподвигло меня написать эту заметку.

Итак, дизайнер Visual Studio 2005 предоставляет простой UI для связывания свойств контролов с параметрами настройки приложения. Поэтому первое, что приходит в голову – просто связать свойства Location и Size формы с настройками, добавить строчку кода для их сохранения, и вот оно, счастье!


Увы, по некоторым причинам это не лучшее решение.

Прежде всего, можно заметить, что для свойства Form.Size возможности связывания с настройками через UI не предоставляется. Это результат того, что данное свойство помечено как DesignerSerializationVisibility.Hidden, так что дизайнер не знает как его сериализовать, не говоря уже о связывании с данными. Однако другое свойство формы, ClientSize, может быть сериализовано.

Ok, а если связать с настройками Location и ClientSize? Можно, но тогда появится другая проблема. Реализуйте этот вариант и попробуйте изменить размер, захватив левый или верхний угол. Поведение формы будет хм... странноватым. Почему так? Подробное объяснение выходит за рамки рассматриваемой темы, могу только сказать, что два пути связывания данных, работающие в контексте установки свойств, оказывают влияние друг на друга (в данном случае, Location и ClientSize сходятся в SetBoundsCore()).

Данное решение также не работает как надо в ситуации, когда пользователь максимизирует форму перед закрытием. В этом случае вы, вероятно, хотели бы не только запомнить, что форма максимизирована, но также и сохранить ее размер и расположение перед тем, как она была развернута, с тем, чтобы можно было восстановить их, когда пользователь нажмет кнопку “Восстановить” (Restore). Точно также хотелось бы обработать и вариант со свернутой (минимизированной) формой. Решение с простым связыванием данных этого не позволяет.

Привязка данных к свойствам Location и Size еще и очень неэффективна. Каждый раз, когда пользователь перемещает форму или изменяет ее размер, Windows посылает сотни сообщений, следуя логике связывания, в то время, когда все что нужно – это сохранить последние позицию и размер перед закрытием формы.

Хорошая новость – это можно сделать в несколько строк кода:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{

   Properties.Settings.Default.MyState = this.WindowState;
   if (this.WindowState == FormWindowState.Normal)
   {
      Properties.Settings.Default.MySize = this.Size;
      Properties.Settings.Default.MyLoc = this.Location;
   }
   else
   {
      Properties.Settings.Default.MySize = this.RestoreBounds.Size;
      Properties.Settings.Default.MyLoc = this.RestoreBounds.Location;
   }
   Properties.Settings.Default.Save();
}

private void Form1_Load(object sender, EventArgs e)
{
   this.Size = Properties.Settings.Default.MySize;
   this.Location = Properties.Settings.Default.MyLoc;
   this.WindowState = Properties.Settings.Default.MyState;
} 

Кстати о Windows Forms 2.0 – много нового материала появилось на сайте WindowsForms.net. Интересные заметки о Windows Forms можно найти в блоге Джессики.


Эта статья опубликована в журнале RSDN Magazine #2-2006. Информацию о журнале можно найти здесь
    Сообщений 7    Оценка 79        Оценить