Как записать положение окна в параметрах настройки приложения Windows Forms

24
задан Don Kirkby 15 January 2016 в 17:51
поделиться

7 ответов

Моя другая опция состоит в том, чтобы записать больше пользовательского кода вокруг параметров настройки приложения и выполнить его на formLoad и formClosed. Это не использует привязку данных.

Недостатки:

    [еще 112] код для записи.
  • Очень трудный. Порядок Вы устанавливаете свойства на formLoad, сбивает с толку. Например, необходимо удостовериться, что Вы установили размер окна перед установкой расстояния разделителя.

Прямо сейчас, это - мое предпочтительное решение, но оно походит на слишком большую работу. Для сокращения работы я создал класс 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);
    }
18
ответ дан Don Kirkby 28 November 2019 в 23:32
поделиться

Образец ниже шоу, как я делаю это

  • 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

6
ответ дан Joe 28 November 2019 в 23:32
поделиться

Простое решение, которое я нашел, должно использовать привязку данных с параметрами настройки приложения. Я связываю местоположение и clientSize свойства на окне наряду с splitterDistance на разделителе.

Недостатки:

  • , Если Вы закрываете окно, в то время как минимизировано, оно открывается скрытый в следующий раз. Действительно трудно вернуть окно.
  • , Если Вы закрываете окно, в то время как максимизируется, оно открывает заполнение целого экрана, но не максимизируемое (незначительная проблема).
  • Изменение размеров окна с помощью верхнего правого угла или нижнего левого угла просто ужасно. Я предполагаю, что два связанных с данными свойства борются друг с другом.

, Если требуется экспериментировать со странным поведением, я отправил демонстрационное решение с помощью этой техники.

5
ответ дан Don Kirkby 28 November 2019 в 23:32
поделиться

Я устанавливаю Настройку для каждого значения, я хочу сохранить, и использовать код как это:

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;
}

Имеют в виду, что перекомпиляция очисток файл конфигурации, где настройки хранятся, так протестируйте его, не делая изменения кода промежуточными сохранение и восстановление.

5
ответ дан Wonko 28 November 2019 в 23:32
поделиться

Можно использовать параметры настройки приложения для установки, какие свойства элементов управления будут сохранены в событии Form_closed, которое необходимо использовать метод сохранения на параметрах настройки приложения для записи их в диск:

Properties.Settings.Default.Save();
2
ответ дан benPearce 28 November 2019 в 23:32
поделиться

Вот пример некоторых, я использую меня. Это только учитывает основной монитор, таким образом, могло бы быть лучше обработать его по-другому, если используется на нескольких мониторах.

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();
2
ответ дан Geir-Tore Lindsve 28 November 2019 в 23:32
поделиться

Взлом можно использовать Настройки, чтобы хранить ту информацию. Все, что необходимо сделать, связывают желаемое свойство (напр. форма. Размер и форма. Местоположение) к определенной установке и это сохраняется и обновило автоматически.

2
ответ дан Dror Helper 28 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: