Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

При закрытии формы "не успевают" сохраниться настройки

07.11.2012, 18:57. Показов 969. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
MainWindow.xaml.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System.Windows;
using Wpf_TimeRandomizer.ViewModel;
 
namespace Wpf_TimeRandomizer
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Closing += (s, e) => ViewModelLocator.Cleanup();
        }
    }
}
MainViewModel.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Threading;
using Wpf_TimeRandomizer.Model;
 
namespace Wpf_TimeRandomizer.ViewModel
{
    public class MainViewModel : ViewModelBase
    {
        private RelayCommand _randomizeCommand;
        private TimeEngine _timeEngine;
        private TimeFormat _timeFormat;
        private DateTime _time;
        private bool _isLoaded;
        private bool _multipleOfFive;
 
        public MainViewModel()
        {
            Configuration = new GlobalConfig();
            Configuration.Loaded += (sender, args) => Dispatcher.CurrentDispatcher.Invoke(
                new Action(() =>
                {
                    _timeEngine = new TimeEngine();
                    Time = _timeEngine.GenerateRandomTime(Configuration.Settings.MinutesMultipleOfFive);
                    MultipleOfFive = Configuration.Settings.MinutesMultipleOfFive;
                    IsSettingsLoaded = true;
                    RaisePropertyChanged("TimeAsText");
                }));
            Configuration.LoadAsync();
        }
 
        //=================
        //== Свойства и т.д.
        //=================
 
        internal GlobalConfig Configuration { get; private set; }
 
        protected override void OnDispose()
        {
            Configuration.Save();
        }
    }
}
GlobalConfig.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.IO;
using System.Threading;
 
namespace Wpf_TimeRandomizer
{
    public class GlobalConfig
    {
        public GlobalConfig()
        {
        }
 
        public AppFolders Folders { get; protected set; }
 
        public AppSettings Settings { get; protected set; }
 
        public event EventHandler Loaded;
 
        public virtual void Save()
        {
             AppSettings.Save(Settings, Path.Combine(Folders.MainData, Constants.SettingsFileName));
        }
 
        public virtual void LoadAsync()
        {
            ThreadPool.QueueUserWorkItem(unused =>
                {
                    Folders = new AppFolders(Constants.AppName);
                    Folders.CheckFolders();
                    Settings = AppSettings.Load(Path.Combine(Folders.MainData, Constants.SettingsFileName)) ?? new AppSettings();
                    OnLoaded();
                });
        }
 
        protected virtual void OnLoaded()
        {
            EventHandler handler = Loaded;
            if (handler != null)
            {
                handler(this, EventArgs.Empty);
            }
        }
    }
}
MainViewModel.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Wpf_TimeRandomizer.ViewModel
{
    public class ViewModelLocator
    {
        private static MainViewModel _main;
 
        /// <summary>
        /// Initializes a new instance of the ViewModelLocator class.
        /// </summary>
        public ViewModelLocator()
        {
            CreateMain();
        }
 
        /// <summary>
        /// Gets the Main property.
        /// </summary>
        public static MainViewModel MainStatic
        {
            get
            {
                if (_main == null)
                {
                    CreateMain();
                }
 
                return _main;
            }
        }
 
        /// <summary>
        /// Gets the Main property.
        /// </summary>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
            "CA1822:MarkMembersAsStatic",
            Justification = "This non-static member is needed for data binding purposes.")]
        public MainViewModel Main
        {
            get { return MainStatic; }
        }
 
        /// <summary>
        /// Provides a deterministic way to delete the Main property.
        /// </summary>
        public static void ClearMain()
        {
            _main.Dispose();
            _main = null;
        }
 
        /// <summary>
        /// Provides a deterministic way to create the Main property.
        /// </summary>
        public static void CreateMain()
        {
            if (_main == null)
            {
                _main = new MainViewModel();
            }
        }
 
        /// <summary>
        /// Cleans up all the resources.
        /// </summary>
        public static void Cleanup()
        {
            ClearMain();
        }
    }
}
Суть такая: закрываю окно, вызывается обработчик события у окна Closing, из него вызывается ViewModelLocator.Cleanup(), он в свою очередь вызывает у MainViewModel метод Dispose, который вызывает Configuration.Save(), но настройки не успевают сохраниться и то есть файл настроек после закрытия окна, то его нет.

Это не нужно думаю, но всё же выложу. Вот метод сохранения настроек.
Из класса AppSettings.cs
C#
1
2
3
4
5
6
7
8
9
        public static void Save(AppSettings settings, String fileName)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(AppSettings));
            using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate))
            using (StreamWriter streamWriter = new StreamWriter(fs))
            {
                xmlSerializer.Serialize(streamWriter, settings);
            }
        }
Добавлено через 8 минут
Вообще суть в том, что я просто хочу сохранить настройки приложения, чтобы при следующем запуске их можно было загрузить. Тут используется паттерн MVVM. У меня на окошке 1 CheckBox и мне надо сохранять его состояние.

Добавлено через 4 минуты
Тьфу, разобрался кажись, дело было в том, что при загрузке настроек вылетало исключение и файл настроек удалялся:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        public static AppSettings Load(String fileName)
        {
            try
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(AppSettings));
                using (FileStream fs = new FileStream(fileName, FileMode.Open))
                using (StreamReader streamReader = new StreamReader(fs))
                {
                    return (AppSettings)xmlSerializer.Deserialize(streamReader);
                }
            }
            catch
            {
                if (File.Exists(fileName))
                    File.Delete(fileName);
            }
            return null;
        }
Добавлено через 1 минуту
Короче сохранение надо сделать так, чтобы кажды раз новый файл создавался, а не дописывались данные в существующий, потому что в существующем почему-то появляется лишний закрывающий тег (>).

Добавлено через 2 минуты
Решил проблему так, в методе Save класса AppSettings поменял параметр:
C#
1
using (FileStream fs = new FileStream(fileName, FileMode.Create))
Было FileMode.CreateNew, стало FileMode.Create

Добавлено через 4 минуты
Кстати, нормальный пример для тех, кто не любит выкладывать код и ждёт помощи, вот даже я тут как можно подробнее выложил, а проблема оказалась вообще в другом месте.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.11.2012, 18:57
Ответы с готовыми решениями:

Как выполнить код в закрытии формы при ее принудительном закрытии?
Привет всем) Суть вопроса такова: есть форма, и при её закрытии нужно выполнить код. Если закрывать форму на крестик или...

Как сохранить настройки при закрытии программы?
Я совсем новичок в этом деле. Второй день блуждаю по форумам, но никак не смог найти ответ. Знаю, что в c# это можно реализовать с помощью...

Не получается при закрытии формы 2 изменить текст label формы 1
Форма 1: private void Btn_Open_Form2_Click(object sender, EventArgs e) { Form2 forma2 = new Form2(); ...

3
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
07.11.2012, 18:58
Цитата Сообщение от Casper-SC Посмотреть сообщение
C#
1
2
using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate))
using (StreamWriter streamWriter = new StreamWriter(fs))
Масло-масленое. Что-нибудь одно оставьте, например using ( streamWriter ..., логичнее будет.
C#
1
using (StreamWriter streamWriter = new StreamWriter( new FileStream(fileName, FileMode.Create) )
Цитата Сообщение от Casper-SC Посмотреть сообщение
чтобы кажды раз новый файл создавался
FileMode.Create ?

Добавлено через 18 секунд
не успел...
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
07.11.2012, 19:00  [ТС]
Цитата Сообщение от SSTREGG Посмотреть сообщение
Масло-масленое. Что-нибудь одно оставьте, например streamWriter, логичнее будет.
В смысле, если оставить streamWriter, то для fs всё равно будет вызван Dispose?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8729 / 3681 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
07.11.2012, 19:02
Casper-SC, нет необходимости в двух using'ах, внутри StreamWriter во время вызова Dispoose вызывается Close для основного (для переданного в конструкторе) потока.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.11.2012, 19:02
Помогаю со студенческими работами здесь

Завершение программы при закрытии формы только по команде пользователя, а не по закрытию формы кодом
В общем , когда программа открывается срабатывает событие OnShow() и открывается другая форма Form4-&gt;ShowModal(). В этой форме...

MessageBox при закрытии формы
Доброго времени суток. Проблема вот какая. Вот этот кусок кинул в MainMenu: procedure TForm1.N4Click(Sender: TObject); var ...

Сохранение при закрытии формы
При закрытии формы, появляется окно предлагающее сохранить работу, есть кнопка Ок и Нет, кнопка Ок должна выполнять метод save(), но кнопка...

Звук при закрытии формы
Как проиграть звук при закрытии формы? OnClose пробовал. Форма просто закрывается. А на OnCloseQuery стоит такое событие. procedure...

Действие при закрытии формы
Как такое сделать?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru