При закрытии формы "не успевают" сохраниться настройки - C#
Формулировка задачи:
MainWindow.xaml.cs
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
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
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
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();
}
}
}Из класса AppSettings.cs
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);
}
}
Вообще суть в том, что я просто хочу сохранить настройки приложения, чтобы при следующем запуске их можно было загрузить. Тут используется паттерн MVVM. У меня на окошке 1 CheckBox и мне надо сохранять его состояние.
Тьфу, разобрался кажись, дело было в том, что при загрузке настроек вылетало исключение и файл настроек удалялся:
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;
}
Короче сохранение надо сделать так, чтобы кажды раз новый файл создавался, а не дописывались данные в существующий, потому что в существующем почему-то появляется лишний закрывающий тег (>).
Решил проблему так, в методе Save класса AppSettings поменял параметр:
using (FileStream fs = new FileStream(fileName, FileMode.Create))
Кстати, нормальный пример для тех, кто не любит выкладывать код и ждёт помощи, вот даже я тут как можно подробнее выложил, а проблема оказалась вообще в другом месте.
Решение задачи: «При закрытии формы "не успевают" сохраниться настройки»
textual
Листинг программы
using (StreamWriter streamWriter = new StreamWriter( new FileStream(fileName, FileMode.Create) )